大数相乘
原创
©著作权归作者所有:来自51CTO博客作者李上花开的原创作品,请联系作者获取转载授权,否则将追究法律责任
说明:如果乘数为A和B,A的位数为m,B的位数为n,则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)。
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string BigMultiply(string, string);
int main() {
string s1, s2;
//用goto语句测试
p:
cin >> s1 >> s2;
string sret = BigMultiply(s1, s2);
cout << sret << endl<<endl;
goto p;
return 0;
}
string BigMultiply(string s1, string s2) {
//1.反转
reverse(s1.begin(), s1.end());
reverse(s2.begin(), s2.end());
int len1 = s1.length();
int len2 = s2.length();
//2.创建两个乘数长度和的存储空间并初始化
char *res = new char[len1 + len2];
for (int i = 0; i < len1+len2; i++)
{
res[i] = '0';
}
//3.具体算法
for (int j = 0; j < len2; j++) {
int ad = 0;//进位
int n2 = s2[j]-'0';//第二个乘数取值
int i=0;//第一个数`位标志
for (; i < len1; i++) {
int r = n2*(s1[i]-'0')+ad+(res[j+i]-'0');
res[j+i] = r % 10+'0';
ad = r / 10;
}
res[j + i ] += ad;
}
//4.返回结果
string sret(res, len1 + len2);
sret = sret.substr(0, sret.find_last_not_of('0')+1);
reverse(sret.begin(), sret.end());
return
运行效果:
