大数相乘----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;
}

 

posted @ 2017-03-03 08:53  Carol淋  阅读(3030)  评论(0编辑  收藏  举报