![]()
/*
大数相乘:
因为是大数,乘积肯定超出了能定义的范围,因此考虑用数组存储,定义三个数组,分别存储乘数,被乘数和积。
规则与平常手算一样,从个位开始分别与被乘数的每一位相乘,但是有一点不同的是:我们先不考虑进位。直接将
个十百千位存储在乘积数组中。乘数的每一位与被乘数相乘时应向左移一位。对应为相加结果存储在乘积数组中,
最后统一考虑进位问题
*/
#include<stdio.h>
#include<conio.h>
int main() {
//假设乘积不会超过一千位;
long m, n;//输入两个数
int a[1000], b[1000], c[1000];
int i = 0, j = 0, k = 0, p, q, flag;
scanf("%ld%ld", &m, &n);
while (m>0) {//将m的各位存入数组
a[i++] = m % 10;
m = m / 10;
}
while (n>0) {
b[j++] = n % 10;
n = n / 10;
}
for (k = 0; k<1000; k++) {
c[k] = 0;
}//初始化c数组;
for (p = 0; p<i; p++) {
flag = p;//表示此轮乘,从c的那个位置开始保存;
for (q = 0; q<j; q++) {
c[flag++] += a[p] * b[q];
}
}
for (i = 0; i<flag; i++) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
while (c[flag] >= 10) {//最后一次进位结果单独处理
c[flag + 1] = c[flag] / 10;
c[flag++] %= 10;
}
for (i = flag; i >= 0; i--) {
if (c[i] == 0 && i == flag) {
}
else {
printf("%d", c[i]);
}
}
getch();
return 0;
}