查找最佳分数Π

查找分子或分母不大于一亿的分数Π


    private static final int MAX_N = 100000000;

    private static void findPIByDivider() {
        Log.d("findPI", "findPIByDivider start MAX_N=" + MAX_N);
        long curtime = System.currentTimeMillis();
        double lastRet = 1;
        int selectI = 0, selectJ = 0;
        double finalRet = 0;
        for (int i = 3; i <= MAX_N; i++) {
            int m = (int) (i / Math.PI);
            for (int j = m; j <= m + 1; j++) {
                double di = i;
                double ret = Math.abs(di / j - Math.PI);
                if (ret < lastRet) {
                    lastRet = ret;
                    selectI = i;
                    selectJ = j;
                    finalRet = di / j;
                }
            }

            if( isPowerOfTen(i) || i == MAX_N) {
                Log.d("findPI", "i=" + String.format("%-12s", i) + " fraction = " + String.format("%12s", selectI) +
                        " / " + String.format("%-12s", selectJ) + " finalRet=" + finalRet);
            }

        }
        Log.d("findPI", "findPIByDivider end. PI=" + Math.PI + " use time=" + (System.currentTimeMillis() - curtime));
    }

    private static void findPIByMulti() {
        Log.d("findPI", "findPIByMulti start MAX_N=" + MAX_N);
        long curtime = System.currentTimeMillis();
        double lastRet = 1;
        int selectI = 0, selectJ = 0;
        double finalRet = 0;
        for (int i = 1; i <= MAX_N; i++) {
            int m = (int) (i * Math.PI);
            for (int j = m; j <= m + 1; j++) {
                double di = i;
                double ret = Math.abs(j / di - Math.PI);
                if (ret < lastRet) {
                    lastRet = ret;
                    selectI = i;
                    selectJ = j;
                    finalRet = j / di;
                }
            }

            if( isPowerOfTen(i) || i == MAX_N) {
                Log.d("findPI", "i=" + String.format("%-12s", i) + " fraction = " + String.format("%12s", selectJ) +
                        " / " + String.format("%-12s", selectI) + " finalRet=" + finalRet);
            }
        }
        Log.d("findPI", "findPIByMulti end. PI=" + Math.PI + " use time=" + (System.currentTimeMillis() - curtime));
    }

    private static boolean isPowerOfTen(int num) {
        int tenPower = 1;
        for (int i = 1; i < 12; i++) {
            tenPower *= 10;
            if (num == tenPower) {
                return true;
            }
        }
        return false;
    }

结果如下:

反复运行后,会发现在做大量运算时,乘法要比除法的效率高一些

相关推荐

  1. 【数据结构】分块查找

    2024-06-11 10:30:04       45 阅读
  2. 突破编程_C++_查找算法(分块查找

    2024-06-11 10:30:04       42 阅读
  3. OpenJudge | 最高分数

    2024-06-11 10:30:04       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 10:30:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 10:30:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 10:30:04       82 阅读
  4. Python语言-面向对象

    2024-06-11 10:30:04       91 阅读

热门阅读

  1. MATLAB 论文绘图规范标注

    2024-06-11 10:30:04       34 阅读
  2. 模块间通信

    2024-06-11 10:30:04       32 阅读
  3. 后端|压缩Base64图片的两种方式

    2024-06-11 10:30:04       31 阅读
  4. 仿写Vue的{{}}语法

    2024-06-11 10:30:04       31 阅读
  5. 初阶c++入门

    2024-06-11 10:30:04       32 阅读
  6. 大数据之flink与hive

    2024-06-11 10:30:04       27 阅读