湖南师大ACM报告:大数相乘问题;http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=10015&courseid=0
一开始感觉这道题目很简单,只要模拟乘法运算就可以了,但是后来在写代码的时候粗心放了一个大错误,改了半个小时才改过来!!总体上而言还是很有收获!
下面的AC的C++代码:
#include<iostream>
#include<string>
using namespace std;
const int M=101;
int a[M],b[M],c[M],d[M*M];
void SUM(int k,int i)
{
int j,t=0,s;
for(j = i,s = 0;s <= k;j++,s++)//把结果错位相加;
{
t = t + c[s] + d[j];
d[j] = t%10;
t = t/10;
}
while(d[j + 1] + t>9)
{
d[j + 1] = (d[j + 1] + t)%10;
t = (d[j + 1] + t)/10;
j++;
}
}
int main()
{
string sa,sb;
int la,lb,i,j,t,k;
while(cin>>sa>>sb)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(d,0,sizeof(d));
la = sa.length();
lb = sb.length();
for(i = la-1,j = 0;i >= 0;i--,j++)
a[j] = sa[i] - '0';
for(i = lb-1,j = 0;i >= 0;i--,j++)
b[j] = sb[i]-'0';
for(i = 0;i < la;i++)
{
memset(c,0,sizeof(c));
k = t = 0;
for(j = 0;j < lb;j++)//存储a的每一位数与b相乘的结果;
{
t = a[i] * b[j] + t;
c[k++] = t % 10;
t = t / 10;
}
c[k] = t;
SUM(k,i);
}
for(i=M*M-1;i>=0;i--)
if(d[i])//因为是从低位存储低位数,所以从后面开始输出;
break;
for(j=i;j>=0;j--)
cout<<d[j];
cout<<endl;
}
return 0;
}