改了一下程序,改用字符串计算3000多位十进制大数乘法的C++小程序
// 2020.01.21 // 作者:shencz2000 // 计算两个大数的乘积,version 0.2 。 c++小程序。
#include<iostream> #include<string> using namespace std; const int M=5000; //第一个数最大位数 const int N=5000; //第二个数最大位数
int multiply(string& bigNum1, string& bigNum2, string& resultBigN); int inputCheck(string& bigN1, string& bigN2); int reverse(string& bigN); int noNumber(string& bigN);
int main() { int i,len,len1,len2,t; string bigN1, bigN2; //给字符数组增加一位用来放结束字符 string result; //给字符数组增加一位用来放结束字符 cout<<"请输入一个2-"<<M<<"位数的数:" ; cin>>bigN1; cout<<"请输入一个2-"<<N<<"位数的数:" ; cin>>bigN2; len1=bigN1.length(); len2=bigN2.length(); len=len1+len2; cout<<"第一个数是:"<<bigN1<<", 有"<<len1<<"位"<<endl; cout<<"第二个数是:"<<bigN2<<", 有"<<len2<<"位"<<endl; t=inputCheck(bigN1, bigN2); if(t==0) { for(i=0;i<(len+1);i++) result+='0'; multiply(bigN1, bigN2, result); cout <<"乘积结果是:"<<result<<", 有"<<result.length()<<"位"<<endl; // system("pause"); //如果在windows下运行该程序,请使该语句有效,即删掉最前面的两个斜杠。 } return 0; }
int noNumber(string& bigN) { int i; for(i=0;i<bigN.length();i++) { if(bigN[i]<'0' || bigN[i]>'9') return 2; } return 0; }
int inputCheck(string& bigN1, string& bigN2) { int i; int status=0; if(bigN1.length()>M || bigN2.length()>N) { cout<<"某个数位数超范围!"<<endl; status=1; } else if(noNumber(bigN1)|| noNumber(bigN2)) { cout<<"某个数有的数字不在0-9之间。"<<endl; status=2; } return status; }
int reverse(string& bigN) { char temp; int i,sl; sl=bigN.length(); for(i=0;i<(sl/2-0.5);i++) { temp=bigN[i]; bigN[i]=bigN[sl-1-i]; bigN[sl-1-i]=temp; } return 0; } int multiply(string& bigNum1, string& bigNum2, string& resultBigN) { int i,j,a,b,d,e,f,g,len1,len2; len1=bigNum1.length(); //两个字符串里的字符数 len2=bigNum2.length(); string tempBigN; //保存一个len1位数与一位数的乘积 for(i=0;i<(len1+1);i++) tempBigN+='0'; reverse(bigNum1); //反转bigNum1和bigNum2 reverse(bigNum2); for(i=0;i<len2;i++) //计算中间值 { a=bigNum2[i]-'0'; e=0; //给两个个位数的乘积的的高位赋初值0 for(j=0;j<len1;j++) { b=bigNum1[j]-'0'; d=b*a+e; e=d/10; f=d%10; tempBigN[j]=f+'0'; } tempBigN[j]=e+'0'; tempBigN[++j]='\0';
/*cout<<"第"<<i<<"次tempBigN的值:"; //显示tempBigN[i]的值 for(j=0;j<len1+1;j++) cout<<tempBigNlen1-j]; cout<<endl; */ g=0; //设置进位的初始值为0 for(j=0;j<(len1+1);j++) { a=resultBigN[j+i]-'0'; b=tempBigN[j]-'0'; d=a+b+g; g=d/10; f=d%10; resultBigN[j+i]=f+'0'; } } reverse(resultBigN); return 0; }