zoukankan      html  css  js  c++  java
  • 大数相乘----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;
    }
  • 相关阅读:
    UVA 11198 Dancing Digits
    UVA 10085 The most distant state
    UVA 321 The New Villa
    UVA 10422 Knights in FEN
    poj2876
    poj2895
    poj2914
    poj2892
    poj2941
    LD SDK LDCControlDll 中 CXMLFile的进一步使用方法,建议以后改进
  • 原文地址:https://www.cnblogs.com/lin0/p/6494212.html
Copyright © 2011-2022 走看看