1381. a*b
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
Give two positive integers a and b, please help us calculate a*b.
Input
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.
Output
The output of each test case should consist of one line, contain the result of a*b.
Sample Input
12 7
Sample Output
14
Problem Source
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);
}
}