最近想计算一下10000多位十进制大数的乘积,没有找到合适的程序,因此自己编了一个C++小程序。如下所示。
试了以下,可以使用。 该程序使用了字符数组。
// 2020.01.22 // 作者:shencz2000 // 计算两个大数的乘积,version 0.5。c++小程序。
#include<iostream> #include<cstring> using namespace std; const int M=12285; //第一个数最大位数 const int N=12285; //第二个数最大位数
int multiply(char bigNum1[], char bigNum2[], char resultBigN[]); int inputCheck(char bigN1[], char bigN2[]); int reverse(char bigN[]); int noAllN(char bigN[]); int input(char bigN[]);
int main() { char bigN1[M+1], bigN2[N+1]; //给字符数组增加一位用来放结束字符 char result[M+N+1]; //给字符数组增加一位用来放结束字符 int len1,len2; cout<<"请输入第一个大数。"<<endl; input(bigN1); cout<<"请输入第二个大数。"<<endl; input(bigN2); if(!inputCheck(bigN1,bigN2)) { len1=strlen(bigN1); len2=strlen(bigN2); cout<<"第一个数是:"<<bigN1<<",有"<<len1<<"位"<<endl; cout<<"第二个数是:"<<bigN2<<",有"<<len2<<"位"<<endl; multiply(bigN1, bigN2, result); cout <<"乘积结果是:"<<result<<endl; cout<<"位数是:"<<strlen(result)<<endl; // system("pause"); //如果在windows下运行该程序,请使该语句有效,即删掉最前面的两个斜杠。 } return 0; }
int input(char bigN[]) { int i,len,j=M/4095,pos=0; char temp[4096],select[5]; cout<<"请输入一个2-"<<M<<"位数的数,前高位后低位。"<<endl; cout<<"输入者将大于4095位的的数按4095位分段,分多段输入。"<<endl ; cout<<"每次输入4095位并且次数少于3次,才能再次输入:"<<endl; do { select[0]='n'; cin>>temp; len=strlen(temp); for(i=0;i<len;i++) bigN[i+pos]=temp[i]; pos+=len; j--; if(len==4095&&j>0) { cout<<"你还要输入吗(请输入y或者n)? :"<<endl; cin>> select; } if(select[0]=='y') cout<<"请输入1-4095位数:"<<endl; } while(select[0]=='y'); bigN[pos]='\0'; return 0; }
int noAllN(char bigN[]) { int i; for(i=0;i<strlen(bigN);i++) { if(bigN[i]<'0' || bigN[i]>'9') return 2; } return 0; }
int inputCheck(char bigN1[], char bigN2[]) { int i, len,len1,len2; int status=0; len1=strlen(bigN1); len2=strlen(bigN2); if(len1>(M+1) |len2>(N+1)) { cout<<"输入的两个数位数超范围!"<<endl; status=1; } else if((status=noAllN(bigN1))||(status=noAllN(bigN2))) cout<<"某个数有的数字不在0-9之间。"<<endl; return status; }
int reverse(char bigN[]) { char temp; int i,sl; sl=strlen(bigN); for(i=0;i<(sl-1)/2;i++) { temp=bigN[i]; bigN[i]=bigN[sl-1-i]; bigN[sl-1-i]=temp; } return 0; } int multiply(char bigNum1[], char bigNum2[], char resultBigN[]) { char tempBigN[M+1+1]; //保存中间计算值的变量。 int i,j; int a,b,d,e,f; int len1,len2; //两个字符数组里的字符数 len1=strlen(bigNum1); len2=strlen(bigNum2); reverse(bigNum1); //反转bigNum1和bigNum2 reverse(bigNum2); for(i=0;i<(len1+len2);i++) //给resultBigN变量赋初值 resultBigN[i]='0'; 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';
/* cout<<"tempBigN["<<i<<"]的值:"; //倒序显示tempBigN[i]的值 for(j=0;j<(len1+1);j++) cout<<tempBigN[i][len1-j]; cout<<endl; */
e=0; //设置进位的初始值为0 for(j=0;j<(len1+1);j++) { a=resultBigN[j+i]-'0'; b=tempBigN[j]-'0'; d=a+b+e; e=d/10; f=d%10; resultBigN[j+i]=f+'0'; } } resultBigN[len1+len2]='\0'; //在有效字符的最后面加一个字符串结束符 reverse(resultBigN); return 0; }