一、题目
求两个不超过200位的非负整数的积。
二、思路
1.接收输入的两个大整数的数字串:
用string接收两个正整数的数字串(C用字符数组或字符指针);
2.从低位往高位存放到数组a和b中;
3.重点:将两个数进行相乘
方法1:计算相乘的过程中,先不考虑进位,后面再处理进位
(1)先不考虑进位,先按竖式计算,求出各个位置相乘得到的数存到数组c中;
(2)然后,再处理进位,用求余
方法2: 计算相乘的过程中,同时处理进位
注意:刚开始时,进位x=0;同时要注意最高位的进位,不要漏了。
4.输出结果
三、实现过程:
1.方法1:
// c = a * b; a,b,c均为高精度数
// 测试数据:12345678900 98765432100
#include <iostream>
using namespace std;
const int MAX = 100;
int toMul(int a[], int b[], int c[], int la, int lb);
int main(int argc, const char * argv[]) {
// 因为第一个数a的位数为len1,b的位数为:len2,所以c应为len1+len2+1
// 如:a,b位数最高为2位数,则最大为:99 * 99 < 100 * 100 = 10000
// 积的位数小于 2 + 2 + 1 = 5;
int a[MAX], b[MAX], c[2*MAX+1], i, la, lb, lc;
string str1, str2;
cout << "请输入两个高精度数(空格隔开):\n";
while(cin >> str1 >> str2) { // 1.输入两个大整数的数字串
cout << "这两个数之积是:\n";
memset(a, 0, sizeof(a)); // 清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
la = (int)str1.size();
lb = (int)str2.size();
// 2.将两个大整数从低位往高位存放到数组中
for(i = 0; i < la; i++)
a[la-i-1] = str1[i] - '0'; // '0'->48
for(i = 0; i < lb; i++)
b[lb-i-1] = str2[i] - 48; // 减去'0'或48都可以
// 3.c=a*b,求两个大整数的积
lc = toMul(a, b, c, la, lb);
// 4.输出结果:从高位往低位输出
for(i = 0; i < lc; i++)
cout << c[lc-i-1];
cout << endl;
cout << "请输入高精度数和一个整数(空格隔开):\n";
}
return 0;
}
// c=a*b,求两个大整数的积
int toMul(int a[], int b[], int c[], int la, int lb) {
int i, j, lc;
// 逐位相乘求出对应位置的数,先不考虑进位
for(i = 0; i < la; i++)
for(j = 0; j < lb; j++) {
c[i+j] = c[i+j] + a[i] * b[j];
}
lc = la + lb; // 积的最大长度
// 处理进位
for(i = 0; i < lc; i++) {
c[i+1] = c[i+1] + c[i] / 10; // 求进位,求出第i位向第i+1位的进位
c[i] = c[i] % 10;
}
while(lc > 0 && c[lc-1] == 0)
lc--;
return lc;
}
测试结果:
2.方法2:
// c = a * b; a,b,c均为高精度数
// 测试数据:12345678900 98765432100
#include <iostream>
using namespace std;
const int MAX = 200;
int main(int argc, const char * argv[]) {
int a[MAX], b[MAX], c[2*MAX+1], i, j, la, lb, lc, x;
string str1, str2;
while(cin >> str1 >> str2) {
memset(a, 0, sizeof(a)); // 清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
// 得到两个大整数的数字串的长度
la = (int)str1.size();
lb = (int)str2.size();
// 2.将两个大整数从低位往高位存放到数组中
for(i = 0; i < la; i++)
a[la-i-1] = str1[i] - '0'; // '0'->48
for(i = 0; i < lb; i++)
b[lb-i-1] = str2[i] - 48; // 减去'0'或48都可以
// 3.c=a*b,求两个大整数的积
for(i = 0; i < la; i++) {
x = 0; // x表示进位,一开始进位为0
for(j = 0; j < lb; j++) {
c[i+j] = c[i+j] + x + a[i] * b[j];
x = c[i+j] / 10; // 得出进位
c[i+j] = c[i+j] % 10; // 只保留个位
}
c[i+lb] = x; // 最高位进位
}
lc = la + lb;
while(lc > 0 && c[lc-1] == 0) // 删去高位多余的0
lc--;
// 输出:从高位往低位输出
for(i = lc-1; i >= 0; i--)
cout << c[i];
cout << endl;
}
return 0;
}
测试结果: