Two big numbers to multiply

本文介绍了一种处理大数乘法的方法,通过定义一个足够大的数组来存储每一位数字,并使用逐位相乘的方式实现了两个大数之间的乘法运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description:

Input two numbers (A and B) which are overflow, then output answer (A * B).
My code is as follows:

// bigNumberToMultiply.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#define MAX_BIT 100 // The most bits is changed by changing MAX_BIT
#define subtract48(a) a -= 48
#define plus48(a) a += 48

int main()
{
    // Initial arraies to store big number.
    char num1[MAX_BIT], num2[MAX_BIT], numTemp[MAX_BIT][MAX_BIT], numFinal[2 * MAX_BIT + 2];
    memset(num1, 0, sizeof(num1));
    memset(num2, 0, sizeof(num2));
    memset(*numTemp, 0, sizeof(numTemp));
    memset(numFinal, 0, sizeof(numFinal));
    int i = 0, j = 0, k = 0;
    gets(num1);
    gets(num2);
    while (num1[i++]){
        subtract48(num1[i - 1]);
    }
    while (num2[j++]){
        subtract48(num2[j - 1]);
    }
    int bit1 = i - 2, bit2 = j - 2;
    // Multiply by each bit
    int more = 0;
    for (i = bit2; i >= 0; i--){
        for (j = bit1; j >= 0; j--){
            numTemp[bit2 - i][bit1 - j] = (num1[j] * num2[i] + more) % 10;
            more = (num1[j] * num2[i] + more) / 10;
        }
        numTemp[bit2 - i][bit1 - j] = more;
        more = 0;
    }
    // To get final answer to numFinal
    int maxBit, currentBit; //currentBit is for numFinal
    for (i = 0; i <= bit2; i++){
        j = MAX_BIT;
        while (!numTemp[i][--j] && j >= 0);
        maxBit = j;
        if (maxBit != 0){
            for (j = 0; j <= maxBit; j++){
                currentBit = j + i;
                numFinal[currentBit] += numTemp[i][j];
                while (numFinal[currentBit++] > 9){
                    numFinal[currentBit] += numFinal[currentBit - 1] / 10;
                    numFinal[currentBit - 1] %= 10;
                }
            }
        }
    }
    i = 2 * MAX_BIT + 2;
    while (!numFinal[--i]);
    for (i; i >= 0; i--){
        plus48(numFinal[i]);
        printf ("%c", numFinal[i]);
    }
    putchar ('\n');
    system("pause");
    return 0;
}

Welcome to contact to me if you find bugs in this program.
My email: alanCode@aliyun.com

在C++中,直接计算这么大的整数乘法可能会导致数值溢出,并不是一种高效或者实际可行的方法。对于这种大规模的数值,通常我们会使用大数库,如`<boost/multiprecision/cpp_int>`(Boost库的一部分),或者是通过分治策略(如Karatsuba算法或Strassen算法)来优化计算。 下面是一个简单的使用`cpp_int`库的例子: ```cpp #include <boost/multiprecision/cpp_int.hpp> using namespace boost::multiprecision; cpp_int multiply_large_numbers(cpp_int a, cpp_int b) { static constexpr int BASE = 100000; std::vector<cpp_int> parts(a.abs(), 0); // 分割大数为便于处理的部分 for (size_t i = 0; i < parts.size(); ++i) { parts[i] = a % BASE; a /= BASE; } std::vector<cpp_int> result(parts.size(), 0); // 计算每个部分的乘积 for (int i = 0; i < parts.size(); ++i) { for (int j = 0; j < parts.size(); ++j) { result[i + j] += parts[i] * parts[j]; } } // 合并结果并考虑正负符号 bool sign_a = a.sign(); bool sign_b = b.sign(); if (!sign_a && !sign_b) return result[0]; // 如果都是正数,不需要处理额外加减 else if (sign_a == sign_b) { // 同号相乘 for (size_t i = 1; i < result.size(); ++i) { result[i] += result[i - 1] / BASE; result[i - 1] %= BASE; } } else { // 异号相乘 for (size_t i = 1; i < result.size(); ++i) { result[i] -= result[i - 1] / BASE; result[i - 1] %= BASE; } result[0] = -result[0]; // 结果取负 } // 可能还需要对进位进行调整 while (result.back() >= BASE) { result.pop_back(); result[parts.size() - 1]++; } if (sign_a != sign_b) result[0] = -result[0]; // 确保最终结果的正确正负 return sign_a ? result[0] : -result[0]; // 返回结果 } ``` 注意这只是一个简化版本,实际使用时可能需要考虑性能优化、错误处理等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值