高精度乘法模板(luogu1303)

洛谷1303

 1 //luogu1303,不压位的高精度乘法
 2 #include <cstdio>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 const int max_n=4040;
 8 
 9 int a[max_n],b[max_n],c[max_n];
10 string x,y;
11 
12 //字符串转数组(倒序)的函数
13 void swi(string s,int a[])
14 {
15     for (int i=0;i<max_n;i++) a[i]=0;
16     int n=s.size()-1;
17     for (int i=n;i>=0;i--)
18     {
19         a[0]++;
20         a[a[0]]=s[i]-'0';
21     }
22 }
23 
24 //c=a*b
25 void multiply(int a[],int b[],int c[])
26 {
27     if (a[0]==1 && a[1]==0 || b[0]==1 && b[1]==0)
28     {
29         c[0]=1;c[1]=0;return;
30     }
31     for (int i=1;i<=a[0]+b[0];i++) c[i]=0;
32     for (int i=1;i<=a[0];i++)
33         for (int j=1;j<=b[0];j++)
34         {
35             c[i+j-1]+=a[i]*b[j];
36             c[i+j]+=c[i+j-1]/10;
37             c[i+j-1]%=10;
38         }
39     if (c[a[0]+b[0]]==0) c[0]=a[0]+b[0]-1;
40     else c[0]=a[0]+b[0];
41 }
42 
43 //输出c
44 void out(int a[])
45 {
46     for (int i=a[0];i>0;i--) printf("%d",a[i]);
47 }
48 int main()
49 {
50     cin>>x>>y;
51     swi(x,a);swi(y,b);
52     multiply(a,b,c);
53     out(c);
54     return 0;
55 }

 

posted @ 2019-08-04 17:17  Klaier  阅读(286)  评论(0编辑  收藏  举报