洛谷 / 题目列表 / 题目详情
P1303 A*B Problem
题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
输入输出样例
输入 #1
1
2
输出 #1
2
说明/提示
每个数字不超过 102000 ,需用高精。
思路:
模拟手算过程,先把两个字符串都倒置存入数组中,例如
368
432
存入数组
863
234
————————
16 12 6
24 18 9
32 24 12
—————————
16 36 56 33 12
————————
6 7 9 8 5 1 (进位代码下面)
逆序输出:158976
然后进位
for(int i=1;i<len;i++)
{
if(ans[i]>=10)
{
ans[i+1] += ans[i]/10;
ans[i]%=10;
}
}
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
int main()
{
string s1,s2;
int a[3100]={0},b[3000]={0},ans[4000]={0};
//ans的数组要开大点,应该要99*99有四位数,999*999有六位数
//所以最好开到2000*2
cin>>s1>>s2;
int len1=s1.length(),len2=s2.length();
int c=1;
for(int i=len1-1;i>=0;i--) //s1存入数组
a[c++]=s1[i]-'0';
c=1;
for(int j=len2-1;j>=0;j--) //s2存入数组
b[c++]=s2[j]-'0';
for(int i=1;i<=len1;i++) //模拟手算
for(int j=1;j<=len2;j++)
ans[i+j-1] += a[i]*b[j];
int len=len1+len2;
for(int i=1;i<len;i++) //进位
{
if(ans[i]>=10)
{
ans[i+1] += ans[i]/10;
ans[i]%=10;
}
}
for(int i=len;i>=1;i--) //去除前面无效的0
{
if(ans[i]==0 && len>1) len--; //保证len有一位,比如0*任何数
else break;
}
for(int i=len;i>=1;i--) //倒序输出
cout<<ans[i];
return 0;
}