大数乘法
实现大数乘法,输入是两个字符串如
n1 = '340282366920938463463374607431768211456'
n2 = '340282366920938463463374607431768211456'
输出
'115792089237316195423570985008687907853269984665640564039457584007913129639936'
要求:不能使用对大数相乘有内建支持的语言;需要包含对输入字符串的合法性校验
n1 = '340282366920938463463374607431768211456'
n2 = '340282366920938463463374607431768211456'
输出
'115792089237316195423570985008687907853269984665640564039457584007913129639936'
要求:不能使用对大数相乘有内建支持的语言;需要包含对输入字符串的合法性校验
输入描述:
一行,两个非负整数n1,n2,保证|n1|+|n2|<10000,其中|n|是n作为字符串的长度
思路:
模拟乘法手算累加,先不算任何的进位,也就是说,将每一位相乘,相加的结果保存到同一个位置,到最后才计算进位。
例如:计算98×21,步骤如下 9 8 × 2 1 ------------- (9) (8) <---- 第1趟: 98×1的每一位结果 (18)(16) <---- 第2趟: 98×2的每一位结果 ------------- (18)(25)(8) <---- 这里就是相对位的和,还没有累加进位这里唯一要注意的便是进位问题,我们可以先不考虑进位,当所有位对应相加,产生结果之后,再考虑。从右向左依次累加,如果该位的数字大于10,那么我们用取余运算,在该位上只保留取余后的个位数,而将十位数进位(通过模运算得到)累加到高位便可,循环直到累加完毕。
核心代码
#include <iostream> #include<algorithm> #include<cstring> using namespace std; int main() { string a,b; cin>>a>>b; int n=a.length(); int m=b.length(); int s[n+m]; memset(s,0,sizeof(s)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) s[i+j]+=(a[i]-'0')*(b[j]-'0'); for(int i=n+m-2;i>0;i--) if(s[i]>=10) { s[i-1]+=s[i]/10; s[i]%=10; } for(int i=0;i<=n+m-2;i++) printf("%d",s[i]); return 0; }
来源:牛客网