C#和java求圆周率的近似值的比较

话说,天朝在数千年就诞生了几个超级变态,其中尤以祖冲之为超级变态,竟然用刘微的“割圆术”将圆周率推算到7位,他推算出π在3.1415926~3.1415927之间。然后领先世界千年。我表示我想不通他们大脑的构造。

后来,圆周率有了这些求法:

这里写图片描述

我选择第二种。

观察得知,第一个数为2/1,并且后一位数的分子是前一位数的分母+1,后一位数的分母是前一位数的分子+1;于是可以动手了。

C#求圆周率近似值代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 圆周率计算 {
    class Program {
        static void Main(string[] args) {
            //printPI();
            printPI_2();

        }
        static void printPI() {
            DateTime time = System.DateTime.Now;
            TimeSpan timeSpanOld = new TimeSpan(time.Ticks);

            Console.WriteLine("开始...");
            long fenmu = 1;//分母
            long fenzi = 2;//分子
            double pi = 2 * fenzi / fenmu;
            int flag = 0;
            long i = 0;
            int lenght = 1;
            while (true) {
                i++;
                //Console.Writeline("第" + i + "次:");
                long temp = fenmu;
                fenmu = fenzi + 1;
                fenzi = temp + 1;
                pi *= (double)fenzi / (double)fenmu;
                //Console.WriteLine("pi=" + pi);
                int newLenght = getNumLenght(i);

                if (newLenght > lenght) {
                    lenght = newLenght;
                    DateTime newTime = System.DateTime.Now;
                    TimeSpan timeSpanNew = new TimeSpan(newTime.Ticks);
                    TimeSpan tickTimeSpan = timeSpanNew.Subtract(timeSpanOld).Duration();

                    long millis = (long)tickTimeSpan.TotalMilliseconds;
                    int second = (int)millis / 1000;
                    int milliSecond = (int)millis % 1000;
                    Console.WriteLine("第" + i + "次循环\n    pi=" + pi + "    耗时:" + second + "秒又" + milliSecond + "毫秒,  ");//循环每增加一级,打印一次
                }
            }

            Console.ReadLine();
        }
        static void printPI_2() {
            DateTime time = System.DateTime.Now;
            TimeSpan timeSpanOld = new TimeSpan(time.Ticks);
            Console.WriteLine("开始...");
            long fenmu = 1;//分母
            long fenzi = 2;//分子
            double pi = 2 * fenzi / fenmu;
            int flag = 0;
            long i = 0;
            int lenght = 1;
            while (true) {
                i++;
                //Console.Writeline("第" + i + "次:");
                long temp = fenmu;
                fenmu = fenzi + 1;
                fenzi = temp + 1;
                pi *= (double)fenzi / (double)fenmu;
                //Console.WriteLine("pi=" + pi);

                if (i == 100000000) {

                    DateTime newTime = System.DateTime.Now;
                    TimeSpan timeSpanNew = new TimeSpan(newTime.Ticks);
                    TimeSpan tickTimeSpan = timeSpanNew.Subtract(timeSpanOld).Duration();

                    long millis = (long)tickTimeSpan.TotalMilliseconds;
                    int second = (int)millis / 1000;
                    int milliSecond = (int)millis % 1000;
                    Console.WriteLine("第" + i + "次循环\n    pi=" + pi + "    耗时:" + second + "秒又" + milliSecond + "毫秒,  ");
                }
            }

            Console.ReadLine();
        }

        /*
         * 求取整数的位数
         */
        static int getNumLenght(long num) {
            int lenght = 0;

            for (long temp = num < 0 ? -num : num; temp > 0; temp /= 10) {
                lenght++;
            }
            return lenght;
        }

    }

}


java版代码:

package date0110am.圆周率;

class Program {
    public static void main(String[] args) {
//      printPI();
        printPI_2();

    }
    static void printPI() {
        long oldCurrMillis = System.currentTimeMillis();

        System.out.println("开始...");
        long fenmu = 1;//分母
        long fenzi = 2;//分子
        double pi = 2*fenzi/fenmu;
        long i = 0;
        int lenght = 1;
        while(true){
            i++;
            //Console.Writeline("第" + i + "次:");
            long temp = fenmu;
            fenmu = fenzi + 1;
            fenzi = temp + 1;
            pi *= (double)fenzi / (double)fenmu;
            //System.out.println("pi=" + pi);
            int newLenght = getNumLenght(i);

            if(newLenght > lenght){
                lenght = newLenght;
                long countMillis = System.currentTimeMillis()-oldCurrMillis ;
                int second = (int) (countMillis / 1000);
                int milliSecond = (int) (countMillis % 1000);

                System.out.println("第" + i + "次循环\n    pi=" + pi + "    耗时:" + second + "秒又" + milliSecond + "毫秒 ");//循环每增加一级,打印一次
            }
        }

//      System.console().readLine();
    }
    static void printPI_2() {
        long oldCurrMillis = System.currentTimeMillis();

        System.out.println("开始...");
        long fenmu = 1;//分母
        long fenzi = 2;//分子
        double pi = 2*fenzi/fenmu;
        long i = 0;
        while(true){
            i++;
            long temp = fenmu;
            fenmu = fenzi + 1;
            fenzi = temp + 1;
            pi *= (double)fenzi / (double)fenmu;

            if(i==1000000000){
                long countMillis = System.currentTimeMillis()-oldCurrMillis ;
                int second = (int) (countMillis / 1000);
                int milliSecond = (int) (countMillis % 1000);

                System.out.println("第" + i + "次循环\n    pi=" + pi + "    耗时:" + second + "秒又" + milliSecond + "毫秒 ");//循环每增加一级,打印一次
            }
        }

//      System.console().readLine();
    }

    /*
     * 求取整数的位数
     */
    static int getNumLenght(long num){
        int lenght = 0;

        for (long temp = num < 0? -num : num ; temp > 0; temp/=10){
            lenght++;
        }            
        return lenght;
    }

}



发现调试模式下的运行会占用时间,所以,C#应该点击.exe文件运行,java使用java -jar xxx.jar命令运行。

C#运行图:

这里写图片描述

我表示很奇怪,第1亿次循环怎么会这么久,第10亿次更是久久不出来。莫非C#充满了垃圾了?所以使用第二个方法:printPI_2( ) 打印。结果:
这里写图片描述

相差了10倍。看来确实被判断整数位数的方法影响了。

再看java的结果:

这里写图片描述

1亿次近6秒,十亿次用67秒。居然比C#跑得快了差不多10倍。

第二个方法printPI_2( ):

这里写图片描述

结果又比C#快了3倍。。。汗水如瀑布。到底是什么原因呢?很奇怪。
十亿次循环,第二个方法printPI_2( ):C#用时76秒又777毫秒;java用时22秒又175毫秒。
真是奇怪。

为什么在这里java跑的比C#快。难道是TimeSpan的原因?
这样看来,C#或许在某些时候并不比java效率高。虽然java是所谓解释性语言,而C#继承了C和C++的优良基因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值