高精度乘法

具体见代码

0需特判!!!

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 using namespace std;
 6 
 7 struct bignum{
 8     int y[50005];
 9     //全部倒存 
10     bignum()
11         {memset(y,0,sizeof(y));} 
12     
13     bignum operator * (const bignum x) const
14     {
15         if((y[0]==1 and y[1]==0)or(x.y[0]==1 and x.y[1]==0))
16         {
17             bignum re;re.y[0]=1,re.y[1]=0;
18             return re;
19         }//本算法的唯一缺陷在于要特判0 
20         bignum re;re.y[0]=y[0]+x.y[0]-1;
21         //初始化位数表示无进位时的最小长度 
22         for(int i=1;i<=y[0];i++)
23             for(int j=1;j<=x.y[0];j++)
24                 re.y[i+j-1]+=y[i]*x.y[j];
25         //由于我是从1开始计算位数的
26         //所以是i+j-1 
27         for(int i=1;i<re.y[0];i++)
28             if(re.y[i]>9) re.y[i+1]+=re.y[i]/10,re.y[i]%=10;
29         //进位    
30         while(re.y[re.y[0]+1]) re.y[0]++;
31         
32         return re;
33     }
34 }; 
35 
36 string b1,b2;
37 bignum q,w,c;
38 
39 int main()
40 {
41     cin>>b1>>b2;
42     q.y[0]=b1.size(),w.y[0]=b2.size();
43     for(int i=0;i<q.y[0];i++) q.y[i+1]=b1[i]-'0';
44     for(int i=0;i<w.y[0];i++) w.y[i+1]=b2[i]-'0';
45     reverse(q.y+1,q.y+1+q.y[0]);
46     reverse(w.y+1,w.y+1+w.y[0]);
47     
48     c=q*w;
49         
50     reverse(c.y+1,c.y+1+c.y[0]);
51     for(int i=1;i<=c.y[0];i++) printf("%d",c.y[i]);
52     return 0;
53 } 
原文地址:https://www.cnblogs.com/shzyk/p/9797517.html