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;
}