C++ 高精度乘法运算(c=a*b)

一、题目

      求两个不超过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;
}

测试结果:

猜你喜欢

转载自blog.csdn.net/chuanzhouxiao/article/details/86548559
今日推荐