Time Limit: 1 secs, Memory Limit: 32 MB
Give two positive integers a and b, please help us calculate a*b.
The first line of the input is a positive integer T. T is the number of test cases followed.
Each test case contain two integer a,b (0<=a<=10^100, 0<=b<=10,000) given in one line.
The output of each test case should consist of one line, contain the result of a*b.
12 7
14
Algorithm Course Examination 2006
没什么好说的,大数据乘法,花点时间就能过了。注意输出的问题就好了,比如答案是9,你不能输出000009。 还有输出0,你不能输出0000000。
#include<bits/stdc++.h> using namespace std; //string ans; char tmp[1002][1002]; //大数据加法 void add(char a[],char b[],char c[]){ if(strlen(a)<strlen(b)) swap(a,b); int carry=0; c[strlen(a)+1]='\0'; for(int i=strlen(a)-1,j=strlen(b)-1;i>=0;i--,j--){ int sum=0; sum+=(a[i]-'0')+carry; if(j>=0) sum+=(b[j]-'0'); c[i+1]=sum%10+'0'; carry=sum/10; } c[0]=carry+'0'; } //乘法 void mul(char a[],char b[],char c[]){ if(strlen(a)<strlen(b)) swap(a,b); int len_small = strlen(b); int len_big = strlen(a); int countt=0; for(int i=len_small-1;i>=0;i--){ int carry=0; for(int j=len_big-1;j>=0;j--){ int sum=(a[j]-'0')*(b[i]-'0')+carry; tmp[countt][j+1]=sum%10+'0'; carry=sum/10; } tmp[countt][0]=carry+'0'; //补零 for(int k=1;k<countt+1;k++) tmp[countt][len_big+k]='0'; tmp[countt][len_big+countt+1]='\0'; countt++; } char ans[1002]="0"; char temp[1002]; for(int i=0;i<countt;i++){ add(tmp[i],ans,temp); strcpy(ans,temp); } int pos=0; int len = strlen(ans); //过滤前导0 for(int i=0;i<len;i++) if(ans[i]!='0'){ pos=i;break; } if(pos==0) printf("0"); else for(int i=pos;i<len;i++){ printf("%c",ans[i]); } printf("\n"); } int main(){ int t; scanf("%d",&t); char a[1002],b[1002],ans[1002]; while(t--){ scanf("%s %s",a,b); mul(a,b,ans); } }
原文地址:http://blog.csdn.net/yuhao199555/article/details/46065427