您的位置:首页 > 编程语言 > Java开发

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

2017-01-10 03:11 211 查看
话说,天朝在数千年就诞生了几个超级变态,其中尤以祖冲之为超级变态,竟然用刘微的“割圆术”将圆周率推算到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++的优良基因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java c# 圆周率