湖南师大acm10015

来源:互联网 发布:海通大智慧软件下载 编辑:程序博客网 时间:2024/03/29 20:24
湖南师大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;}