大整数乘法
这次的一题又是高精度系列的了。。。先看一下题目:
题目
总Time Limit: 1000ms Memory Limit: 65536kB
Description
求两个不超过200位的非负整数的积。
Input
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
Output
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
Sample Input
12345678900
98765432100
Sample Output
1219326311126352690000
思路
首先这个绝对不是什么int,long long,之类的数据类型就可以轻易解决地,肯定要用数组来逐个处理啦。做法就是类似模拟乘法算式,记住,前导0一定要去掉。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
char c1[205],c2[205];
cin>>c1>>c2;
int n1[205] = {0},n2[205] = {0},n3[2018] = {0};
int i,z = 0,j;
int len1 = strlen(c1),len2 = strlen(c2);
for(i = 1;i<=len1;i++)n1[i] = c1[len1-i]-48;
for(i = 1;i<=len2;i++)n2[i] = c2[len2-i]-48;
for(i = 1;i<=len1;i++){
z = 0;
for(j = 1;j<=len2;j++){
n3[i+j-1]+=n1[i]*n2[j]+z;
z = n3[i+j-1]/10;
n3[i+j-1]%=10;
}
n3[i+j-1] = z;
}
i = len1+len2;
while(n3[i] == 0&&i>=0)i--;
if(i == -1){
cout<<0;
}
while(i>=1)cout<<n3[i--];
return 0;
}