最近想计算一下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;
}
版权声明:本文为u013079470原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。