数字计算效率C++和Java。

MrBone MrBone 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
做了个小测试,分别用C++和Java编写了一个计算圆周率PI的小程序,计算结果是Java的居然比C++的快同样计算了5W位,C++耗时1211560MS,Java耗时681156,我属于菜鸟中的菜鸟,但印象里好像有人说过C++比Java更擅长类似于这种计算,哪位牛人能解释下我的疑惑么?为什么我的这个测试会Java更快些?前来鄙视的就飘过吧~

下附两段小程序:

C++:

#include <iostream> //π的计算公式:π/2=1+1!/3!!+2!/5!!+3!/7!!+...+k!/(2*k+1)!!+...
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

using namespace std;

int main(int argc,char *argv[])
{
double time_start, time_finish, time_compute;
int modeofout = 0;
time_start = clock();

const int SIZE=atoi(argv[1])+10,WEI=atoi(argv[1]);
int *x=new int[SIZE]; int *z=new int[SIZE];
int a=1,b=3,c,d,Run=1,Cut=0; //A是分子里的项,B是分母里的项。C和D是中间变量。
for(int XoX=0;XoX <SIZE;XoX++) //初始化数字Z,X数组的每一项,都赋值为0。
{x[XoX]=0;z[XoX]=0;}
x[1]=2;z[1]=2;

while(Run&&(++Cut <200000)) //主体
{
d=0;

for(int i=SIZE-1;i>0;i--) //计算通项的分子,并把分子的值赋值给数组Z。
{
c=z[i]*a+d;
z[i]=c%10;
d=c/10;
}

d=0;

for(i=0;i <SIZE;i++) //计算z/=b,就是把1/1,(1×2)/3,(1×2×3)/(3×5)……分别放入z中
{
c=z[i]+d*10;
z[i]=c/b; //保证z中只存放一个个位数,如果z中的数大于10,则需取得十位数加至z[i-1]
d=c%b;
}

Run=0;

for(i=SIZE-1;i>0;i--) //把数组Z里的值累加到数组X里,模仿乘法的竖式计算,从后向前写入。
{
c=x[i]+z[i];
x[i]=c%10;
x[i-1]+=c/10;
Run|=z[i];
}

a++;
b+=2;
cout <<"第" <<Cut <<"次运算!\n";
}

time_finish = clock();
time_compute = double(time_finish-time_start);
switch (modeofout)
{
case 0:
{
FILE *fileofout = fopen (argv[2], "w");
fprintf (fileofout, "pi = %d.", x[1]);
for (int i = 2; i < SIZE; i++)
fprintf(fileofout,"%d",x[i]);
for(i=0;i <50;i++)cout <<"-";
cout <<"\n共进行了计算了" <<Cut <<"次!\n";
cout <<"小数点后" <<WEI <<"位的";
cout <<"i=" <<x[1] <<".\n";

for(i=0;i <WEI;i++)
{
if (i&&((i%5)==0)) cout <<' ';
if (i&&((i%50)==0))cout <<"\r\n";
cout <<(int)x[i+2];
}

cout <<"计算时间为" << time_compute <<"ms\n";
cout <<endl;
}
break;
case 1:
{
for(int i=0;i <50;i++)cout <<"-";
cout <<"\n共进行了计算了" <<Cut <<"次!\n";
cout <<"小数点后" <<WEI <<"位的";
cout <<"i=" <<x[1] <<".\n";

for(i=0;i <WEI;i++)
{
if (i&&((i%5)==0)) cout <<' ';
if (i&&((i%50)==0))cout <<"\r\n";
cout <<(int)x[i+2];
}

cout <<"计算时间为" << time_compute <<"ms\n";
cout <<endl;
}
cout <<endl;
break;

}
}

java:

import java.util.Date;
import java.io.*;

public class PI {
public static void main(String[] args) {

//程序运行初始时间
Date date = new Date();
long previousTime = date.getTime();
long lastTime = 0;

//设置1个参数,如果等于1,则计算并把结果写入文件,且计算时间,如果等于2,计算并计算时间,不写文件,但计算结果,在 屏幕输出 如果等于3,only计算,不在屏幕输出结果,只显示计算时间~
int choose = 0;

try {
choose = Integer.parseInt(args[0]);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Please input a number to choose the way that you want to see!");
System.exit(-1);
} catch(Exception e) {
System.out.println("Please input a correct number!");
System.exit(-1);
}



//将结果输出到文件中
File f = new File("d://PI_2.txt");
String strEncode = "UTF-8";

BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), strEncode));
} catch(IOException e) {
e.printStackTrace();
}

StringBuilder sb = new StringBuilder();


/*定义存放结果的数组大小和要显示的位数,即火车车厢的个数*/
int ARRSIZE = 1100;
int DISPCNT = 1000;

/* x数组存放π的值,z数组存放迭加单项,生成火车 */
int[] x = new int[ARRSIZE];
int[] z = new int[ARRSIZE];
int a = 1;
int b = 3;
int c = 0;
int d = 0;
int Cut = 0;

x[1] = 2;
z[1] = 2;
/* 开始计算(开始填充各个车厢) */

while(++Cut < 100000) {
d=0;
/* 以下代码完成了z+=a的功能 */
/* 就是将1,1×2,1×2×3,…分别放入z中 */
for (int i=ARRSIZE-1; i>0; i--) {
c = z[i] * a + d;
/* 以下两行保证z中只存放一个个位数 */
/* 如果z中的数大于10,则需取得十位数加至z[i-1] */
/* 这就是在模拟竖式中的进位 */
z[i] = c % 10;
d = c / 10;
}
d = 0;
/* 以下代码完成了z/=b的功能 */
/* 就是将1/1,(1×2)/3,(1×2×3)/(3×5),…分别放入z中 */

for (int i=0; i<ARRSIZE; i++) {
c = z[i] + d * 10;
/* 以下两行保证z中只存放一个个位数 */
/* 如果z中的数大于10,则需取得十位数加至z[i-1] */
z[i] = c / b;
d = c % b;
}

/* 以下代码完成了x+=z的功能,就是将z分别迭加至x中 */
for (int i = ARRSIZE - 1; i > 0; i--) {
c = x[i] + z[i];
/* 以下两行保证x中只存放一个个位数 */
/* 如果x中的数大于10,则需取得十位数加至x[i-1] */
x[i] = c % 10;
x[i - 1] += c / 10;

//Run|=z;
/* "|="的运行方式:当z全为0时,Run便为0,否则为1 */
}
a++;
b += 2;
//System.out.println("第" + Cut + "次运算!");
}

/* 输出小数点后的所有位 */
for(int i=1; i<x.length; i++) {
if(i == 2) {
sb.append(".");
}
if(i%5 == 0) {
sb.append("");
}
if(i%50 == 0) {
sb.append("");
}
sb.append(x[i]);
}


//程序运行结束时间
date = new Date();
lastTime = date.getTime();
long useTime = lastTime - previousTime;

sb.append("\r");
sb.append("一共运行" + useTime + "毫秒");


if(choose == 1) {
try {
bw.write(sb.toString());
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
} catch(IOException e) {
e.printStackTrace();
}
}

System.out.println("运行结果输出到D://PI_2.txt文件中");
}

if(choose == 2) {
System.out.println("-共进行计算" + Cut + "次!");
System.out.println("小数点后" + DISPCNT + "位");
System.out.println(sb.toString());
}

if(choose == 3) {
System.out.println("一共运行" + useTime + "毫秒");
}

}
}



...全文

相关推荐

评论 24
收藏 已收藏
分享
返回顶部
MrBone
C++ 语言 65,214 成员 250,514 内容