bzoj 2179
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 }