您的位置:首页 > 其它

大数相乘

2018-03-27 15:31 375 查看
前言:
采用的方法是逐位相乘进位法。
例子1:
A=24=2*10+4=(4,2);
B=12=1*10+2=(2,1);
C=A*B=(4*2,4*1+2*2,2*1)=(8,8,2)=228;
例子2:
A=17=1*10+7=(7,1);
B=25=2*10+5=(5,2);
C=A*B=(7*5,7*2+1*5,1*2)=(35,19,2)=(5,22,2)=(5,2,4)=425;
代码如下:#include<iostream>
#include<string>
#include<memory>
#define maxn 1000
using namespace std;
char* show(string s1, string s2) {
int num1[maxn], num2[maxn], num[maxn];
int len1 = s1.length();
int len2 = s2.length();
int len = len1 + len2;
int i,j;
for (i = 0; i < len1; i++) //字符串反序,并转换为数字
num1[i] = s1[len1-1-i] - '0';
for (i = 0; i < len2; i++)
num2[i] = s2[len2-1-i] - '0';
memset(num, 0, sizeof(num)); //*
for (i = 0; i < len1; i++)
for (j = 0; j < len2; j++)
num[i + j] += num1[i] * num2[j]; //逐位相乘
for (i = 0, j = 0; i < len; i++) { //处理进位
int k = num[i] + j;
num[i] = k % 10;
j = k / 10;
}
for (i = len - 1; i >= 0; i--) //去掉多余的0
if (num[i] != 0)break;
len = i + 1;
char *s;
s = new char[len+1];
//char s[maxn]; 不采用这种写法的原因是,数组是在栈中,返回s会弹栈(释放内存),s就会变成野指针
if (len == 0) {
s[0] = 0 + '0';
s[len + 1] = '\0';
}
else {
for (i = 0; i < len; i++)
s[i] = num[len - 1 - i] + '0';
s[len] = '\0'; //一定要加上
}
return s;
}
int main() {
//text
string s1, s2;
cin >> s1 >> s2;
cout << show(s1, s2) << endl;
return 0;
}对于代码有疑问的朋友欢迎留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: