时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263。要想计算更加规模的数,就要用软件来扩展了,比如用数组或字符串来模拟更多规模的数及共运算。 现在输入两个整数,请输出它们的乘积。 输入格式 两行,每行一个正整数,每个整数不超过10000位 输出格式 一行,两个整数的乘积。 样例输入 99 101 样例输出 9999 数据规模和约定 每个整数不超过10000位
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
string a;
string b;
int flag=2;
int max;
int len;
int u;
int c[20002]={0};
int e[10001];
int d[10001];
cin>>a;
cin>>b;
for(int i=0,l=a.length()-1;i<a.length();)
e[l--]=a[i++]-'0';
for(int j=0,m=b.length() -1;j<b.length();)
d[m--]=b[j++]-'0';
if(a.length()>b.length())//a的长度长一些
{
len=b.length();
flag=1;
max=a.length();
}
else//b 的长度长一些
{
len=a.length();
flag=0;
max=b.length();
}
if(flag==0)
{
for(int i=0;i<len;i++)//短的控制外层循环,每一个和内层循环的相乘
{
int k=i;
for(int j=0;j<max;j++)
{
int s=c[k]+e[i]*d[j];
c[k]=s%10;
c[k+1]=s/10+c[k+1];
k++;
}
}
}
else
{
for(int i=0;i<len;i++)//短的控制外层循环,每一个和内层循环的相乘
{
int k=i;
for(int j=0;j<max;j++)
{
int s=c[k]+d[i]*e[j];
c[k]=s%10;
c[k+1]=s/10+c[k+1];
k++;
}
}
}
for(int x=20000;x>=0;x--)
{
if(c[x]!=0)
{
u=x;
break;
}
}
for(int o=u;o>=0;o--)
{
cout<<c[o];
}
return 0;
}
这道题就是大数加法和阶乘结合在一起,
每一位依次相乘
最后加在一次
每一次都对结果取余数是当前的位数结果
/10是产生的进位