查找分子或分母不大于一亿的分数Π
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;}
结果如下:
反复运行后,会发现在做大量运算时,乘法要比除法的效率高一些