1381. a*b
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
题目分析:
大数相乘:由于数字太大,不能直接相乘,必须先转换成字符串,然后再逐位相乘。
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int num[10000];
int sa[10000];
int sb[10000];
int main()
{
int time;
cin>>time;
while(time--)
{
memset(num,0,sizeof(num));//把数组初始化为0
memset(sa,0,sizeof(sa));
memset(sb,0,sizeof(sb));
string a,b;
cin>>a>>b;
if(a=="0"||b=="0") //若a,b其中一个为0,则输出0
{
cout<<0<<endl;
continue;
}
//以 1为初始位分别逆向存储a,b的每位数字
int n=1,m=1;
for(int i=a.size()-1;i>=0;i--) sa[n++]=a[i]-'0';
for(int i=b.size()-1;i>=0;i--) sb[m++]=b[i]-'0';
for(int i=1;i<m;i++) //相乘处理
{
int v=0; //初始化进位为0
for(int j=1;j<n;j++)
{
num[i+j-1]+=sb[i]*sa[j];
v=num[i+j-1]/10; //进位
num[i+j]+=v; //下一位加上前一位的进位
num[i+j-1]=num[i+j-1]%10; //求余即为本位当前数值
}
}
for(int k=9999;k>=1;k--) //逆向输出答案
{
if(num[k]!=0)
{
for(int i=k;i>=1;i--) cout<<num[i];
cout<<endl;
break;
}
}
}
return 0;
}