大数相乘----C语言
/* 大数相乘: 因为是大数,乘积肯定超出了能定义的范围,因此考虑用数组存储,定义三个数组,分别存储乘数,被乘数和积。 规则与平常手算一样,从个位开始分别与被乘数的每一位相乘,但是有一点不同的是:我们先不考虑进位。直接将 个十百千位存储在乘积数组中。乘数的每一位与被乘数相乘时应向左移一位。对应为相加结果存储在乘积数组中, 最后统一考虑进位问题 */ #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; }