Description
给出两个n位10进制整数x和y,你需要计算x*y。


【题目分析】

高精裸题。练手。

【代码】

1、手动高精

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 #define MAXN 5000
 5 char a_s[MAXN],b_s[MAXN];
 6 int a_len,b_len,i,c[MAXN][MAXN],k,j,sum[MAXN],a[MAXN],b[MAXN];
 7 int sumlen()
 8 {
 9     int nu=0;
10     for(int ii=a_len+b_len;ii>=1;ii--)
11         if(sum[ii])break;
12         else nu++;
13     return a_len+b_len-nu;
14 }
15 int main()
16 {
17     int n;cin>>n;
18     scanf("%s%s",&a_s,&b_s);
19     if(!strcmp(a_s,"0")||!strcmp(b_s,"0")){printf("0\n");return 0;}
20     memset(a,0,sizeof(a));
21     memset(b,0,sizeof(b));
22     a_len=strlen(a_s);
23     b_len=strlen(b_s);
24     for(i=0;i<a_len;i++)a[a_len-i]=a_s[i]-'0';
25     for(i=0;i<b_len;i++)b[b_len-i]=b_s[i]-'0';
26     memset(c,0,sizeof(c));
27     for(i=1;i<=b_len;i++)
28     {
29         k=0;
30         for(j=1;j<=a_len;j++)
31         {
32             c[i][j+i-1]=a[j]*b[i]+k;
33             k=c[i][j+i-1]/10;
34             c[i][j+i-1]%=10;
35         }
36         c[i][a_len+i]+=k;
37     }
38     memset(sum,0,sizeof(sum));
39     for(i=1;i<=b_len;i++)
40     {
41         k=0;
42         for(j=1;j<=a_len+b_len;j++)
43         {
44             sum[j]=sum[j]+c[i][j]+k;
45             k=sum[j]/10;
46             sum[j]%=10;
47         }
48         sum[sumlen()+1]+=k;
49     }
50     for(i=sumlen();i>=1;i--)printf("%d",sum[i]);
51     putchar('\n');
52     return 0;
53 }
手动高精

相关文章: