时间限制: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是产生的进位