www.gusucode.com > VC和VB两程序比比谁的速度快?有源代码文件 > VC和VB两程序比比谁的速度快?有源代码文件/code/VB-VC-pi/VC-NBS=4.cpp
#include<iostream.h> #include<math.h> #include<stdlib.h>//system("pause") #include <time.h> main() { int i; int Nbs=4; const int Base=pow(10,Nbs);//基数 int Npi;//有效数字位数 cout<<"请输入有效数字位数"<<endl; cin>>Npi; const int Na = Npi / Nbs + 2;//数组长度 const int Na_1=Na-1;//Na-1 int *A=new int[Na];//和 int *B=new int[Na];//项(未除以等差因子) for(i=0;i<=Na_1;i++){ A[i]=0; B[i]=0; } //求和 int C1, C2, C3, C4;//各阶段余数 int E;//中间结果(被除数) int F1;//中间结果(商) int F2;//中间结果(商) int Divd;//等差因子 int D2;//等差因子Divd第二 int X2;//B的除法增量 int Ia1;//指向B中第一个非零元素 int Ia2;//指向B中最后一个非零元素 cout<<"开始计时"<<endl; time_t elapse = clock(); //-------------计算"16 * atn(1 / 5) "-------------- //初始化 //制作首项B=16/5 = 3.2,并令A=B B[0] = 3; B[1] = Base / 5; A[0] = B[0]; A[1] = B[1]; Divd = 3; Ia1 = 0; Ia2 = 1; X2= 25; while( Ia1 < Na){ C1 = 0; C2 = 0; for( i = Ia1;i<=Ia2 + 1;i++){//到Ia2+1是为保证X2除尽 E = C1 * Base + B[i]; F1 = E / X2; C1 = E -F1 * X2; B[i] = F1; // E = C2 * Base + F1; F1 = E / Divd; C2 = E - F1 * Divd; A[i] = A[i] - F1; } for(;i<= Na_1;i++){//由于X2已除尽,所以再除时不考虑X2 E = C2 * Base; F1 = E / Divd; C2 = E - F1 * Divd; A[i] = A[i] - F1; } while(Ia1<Na && B[Ia1] == 0) Ia1++; if(Ia2 < Na_1 && B[Ia2 + 1] > 0 ) Ia2++; //---- Divd = Divd + 2; C1 = 0; C2 = 0; for( i = Ia1;i<= Ia2 + 1;i++){ E = C1 * Base + B[i]; F1 = E / X2; C1 = E - F1 * X2; B[i] = F1; E = C2 * Base+F1; F1 = E / Divd; C2 = E -F1* Divd; A[i] = A[i] + F1; } for(;i<= Na_1;i++){ E = C2 * Base; F1 = E / Divd; C2 = E -F1* Divd; A[i] = A[i] + F1; } while(Ia1<Na&&B[Ia1] == 0){ Ia1++; } if(Ia2 < Na_1 && B[Ia2 + 1] > 0 ){ Ia2++; } Divd = Divd + 2; } //----------计算"A- 4 * atn(1 / 239)"------------------------------- //初始化 //制作首项B=4/239,并令A=B int C = 4; for( i = 1 ;i<= Na_1;i++){ E = C*Base; F1 = E / 239; C = E -F1* 239; B[i]=F1; A[i]=A[i]-F1; } Divd = 3; Ia1 = 1; Ia2=Na_1; X2 = 57121;//239^2 while(Ia1 < Na){ C1 = B[Ia1];//由于Base小于X2,所以B[Ia1]可直接看成余数 C2 = 0; C3 = 0; C4 = 0; Ia1 = Ia1 + 1; D2 = Divd + 2; for(i = Ia1;i<=Ia2;i++){ //正项 //除以X2 E=C1*Base; E+=B[i]; F1 = E / X2; C1 = E -F1* X2; //除以等差因子 E=C2*Base ; E+=F1; F2 = E / Divd; C2 = E -F2* Divd; A[i]=A[i]+F2; //负项 //除以X2 E=C3*Base ; E+=F1; F1 = E / X2; C3 = E -F1* X2; //除以等差因子 E=C4*Base ; E+=F1; F2 = E / D2; C4 = E -F2* D2; A[i]=A[i]-F2; B[i] = F1; } while(Ia1<Na&&B[Ia1] == 0){ Ia1++; } Divd = Divd + 4; } //处理A的进位和借位 int nborrow; int _Ai; for(i=Na_1;i>=0;i--){ if(A[i]<0){ _Ai=-A[i]; nborrow=ceil((double)_Ai/Base);//向前借位数 A[i-1]-=nborrow; A[i]+=nborrow*Base; }else if(A[i]>=Base){ A[i-1]+=A[i]/Base; A[i]=A[i]%Base; } } //输出时间 cout<<"计算完成"<<endl; double elps= (clock() - elapse)*1.0/1000; cout <<"耗时"<<elps<<"秒"<<endl; cout<<"按任意键输出结果:"<<endl; system("pause"); //输出结果 for(i=0; i<Na_1; i++) { int len; if(A[i]==0)len=1; else len=log(A[i])/log(10)+1; for(int j=1;j<=Nbs-len;j++)cout<<"0"; cout<<A[i]<<","; } cout<<endl; cout<<endl; cout<<"共输出"<<Na*Nbs<<"位"<<endl; cout<<"最后一段("<<Nbs<<"位)不保证正确"<<endl; }