高精度乘法
没啥好说了
首先,一个int存一个数浪费,最后溢出改longlong(这也是浪费啊!!!),这就不提。。。
注意补全输出到六位!
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n; 5 char a[10000],b[10000]; 6 long long s1[10000],s2[10000],ans[100000]; 7 const long long mod=1e6; 8 //struct yl{ 9 // int num,val; 10 //}s[50010]; 11 //int tree[50000]; 12 //bool cmp(yl p,yl q) 13 //{ 14 // return p.val>q.val; 15 //} 16 //void add(int a,int b,int c) 17 //{ 18 // r++; 19 // q[r].x=a;q[r].y=b;q[r].w=c; 20 //} 21 22 23 //#define nx x+d[h][0] 24 //#define ny y+d[h][1] 25 26 inline int read() 27 { 28 char ch=getchar(); 29 int k=0; 30 while (ch<‘0‘ || ch>‘9‘) { 31 ch=getchar(); 32 } 33 while (ch>=‘0‘&&ch<=‘9‘) k=k*10+(ch^48),ch=getchar(); 34 return k; 35 } 36 37 int main() 38 { 39 scanf ("%s %s",a,b); 40 int lena=strlen(a); 41 int lenb=strlen(b); 42 int len=0; 43 for (int i=lena-1,j=i-5;i>=0;i-=6,j-=6) 44 { 45 if (j<0) j=0; 46 for (int k=j;k<=i;k++) 47 s1[(lena-i-1)/6]=s1[(lena-i-1)/6]*10+a[k]-‘0‘; 48 } 49 for (int i=lenb-1,j=i-5;i>=0;i-=6,j-=6) 50 { 51 if (j<0) j=0; 52 for (int k=j;k<=i;k++) 53 s2[(lenb-i-1)/6]=s2[(lenb-i-1)/6]*10+b[k]-‘0‘; 54 } 55 for (int i=0;i<=lena/6;i++) 56 for (int j=0;j<=lenb/6;j++) 57 { 58 ans[i+j+1]+=(s1[i]*s2[j]); 59 ans[i+j+2]+=(ans[i+j+1]/mod); 60 ans[i+j+1]%=mod; 61 if (ans[i+j+1]!=0) len=max(len,i+j+1); 62 if (ans[i+j+2]!=0) len=max(len,i+j+2); 63 } 64 for (int i=len;i>0;i--) 65 { 66 if (i!=len) printf("%06lld",ans[i]); 67 else printf("%lld",ans[i]); 68 } 69 if (len==0) printf("0\n"); 70 return 0; 71 }
- C++,1.33KB
- 耗时/内存0ms, 2257KB