大数乘法

实现大数乘法,输入是两个字符串如
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;
}

链接:
https://www.nowcoder.com/questionTerminal/6b668316f0ac4421ae86d7ead4301b42
来源:牛客网