【题目描述】
求两个不超过200位的非负整数的积。
【输入】
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
【输出】
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
12345678900 98765432100【输出样例】
1219326311126352690000
【参考程序一】
#include<bits/stdc++.h>
using namespace std;
int a_i[251],b_i[251],c_i[200001];
char a_c[251],b_c[251];
int lena,lenb,lenc=0;
int highPrecisionMulti(int a[],int b[])
{
int lc=1,x;
for(int i=1;i<=lena;i++)
{
x=0; //用于存放进位
for (int j=1;j<=lenb;j++) //对乘数的每一位进行处理
{
c_i[i+j-1]=a[i]*b[j]+x+c_i[i+j-1]; //当前乘积+上次乘积进位+原数
x=c_i[i+j-1]/10;
c_i[i+j-1] %= 10;
}
c_i[i+lenb]=x;
}
lc=lena+lenb;
while(c_i[lc]==0&&lc>=1)//去除计算后的前导0
{
lc--;
}
return lc;
}
int main()
{
cin>>a_c>>b_c;
lena=strlen(a_c);
lenb=strlen(b_c);
//cout<<lena<<" "<<lenb;
for(int i=0;i<=lena-1;i++)
{
a_i[lena-i]=a_c[i]-'0';//字符数组转整形数组 倒序存储 索引1-lena
}
for(int i=0;i<=lenb-1;i++)
{
b_i[lenb-i]=b_c[i]-'0';//字符数组转整形数组 倒序存储 索引1-lenb
}
//高精度乘法
lenc=highPrecisionMulti(a_i,b_i);
if(lenc>1)
{
for(int i=lenc;i>=1;i--)
{
cout<<c_i[i];
}
}
return 0;
}
(1)数据的接收方法和存贮方法
数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中。另一种方法是直接用循环加数组方法输入数据。
void init(int a[]) //传入一个数组
{
string s;cin>>s; //读入字符串s
len=s.length(); //用len计算字符串s的位数
for(i=1;i<=len;i++)
a[i]=s[len-i] -‘0’; //将数串s转换为数组a,并倒序存储
}另一种方法是直接用循环加数组方法输入数据。
(2) 高精度数位数的确定
位数的确定:接收时往往是用字符串的,所以它的位数就等于字符串的长度。
(3) 进位,借位处理
加法进位:c[i]=a[i]+b[i];
if (c[i]>=10) { c[i]%=10; ++c[i+1]; }
减法借位:if (a[i]<b[i]) { --a[i+1]; a[i]+=10; }
c[i]=a[i]-b[i];
乘法进位:c[i+j-1]= a[i]*b[j] + x + c[i+j-1];
x = c[i+j-1]/10;
c[i+j-1] %= 10;
(4) 商和余数的求法
商和余数处理:视被除数和除数的位数情况进行处理.