高精度算法-乘法

//高精度算法-乘法-(1) 大整数 x 整数
#include <iostream>
#include <string>
#include<cstring>
using namespace std;
char s1[200]; // 大精度数存储
int a[260] = { 0 }, b, c[261] = {0}; // b为整数 int 型
int main()
{
    cin >> s1 >> b; // 输入大精度数 与 整数
    if (b == 0) {
        cout << 0; // 乘数出现0 结果为0
    }
    else {
        int slen = strlen(s1); // 获取s1的长度 它的头文件是cstring
        if (b < 0) { // 如果是负整数 那么需要添加一个'-'
            cout << '-';
            b *= -1; // 换成正整数
        }
        for (int i = 0; i < slen; i++) {
            a[i] = s1[slen - 1 - i] - '0';
        } // 转存到数组里,但注意,这是倒着存的,即 个十百千万....
        for (int k = 0; k < slen; k++) {
            c[k] += a[k] * b; //先获取到某位 乘以 整数的结果
            if (c[k] >= 10) { // 如果结果超过10要进位
                c[k + 1] += c[k] / 10; // 算出需要进位的数,因为我们数组的每位都只能存储0-9
                c[k] = c[k] % 10; // c[k]真实应该表示的数
            }
        } 
        if (c[slen]) slen++; // 单独检测最高位是否产生了进位 如果是,则++
        for (int i = 0; i < slen; i++) {
            cout << c[slen - 1 - i]; // 打印输出
        }
    }
    return 0;
}

大精度 x 整数 相对而言不需要太多道理,只需要简单的做乘法 进位

大精度 x 大精度 则需要通过双for循环来计算c值 代码如下:

//高精度算法-乘法-(2) 大整数 x 大整数
#include <iostream>
#include <string>
#include<cstring>
using namespace std;
char s1[200], s2[200]; // 大精度数存储 与乘法(1)的区别是要存储2个大整数
int a[200], b[200], c[410]; //把字符串转化之后存储的位置 a,b为大字符串转化结果
// c为计算结果
void z_int(char a[], int b[]) { //这个函数2个参数 
    int len = strlen(a); // 获取传入的char组的长度
    for (int i = 0; i < len; i++) {
        b[i] = a[len - i - 1] - '0';
    }//翻转 + 转化字符为int
}
int main()
{
    cin >> s1 >> s2;
    z_int(s1, a); z_int(s2, b); // 把大整数送入函数使int数组a,b记录上它们
    int len_a = strlen(s1), len_b = strlen(s2); // 获取大整数的长度
    for (int i = 0; i < len_a; i++) {
        for (int k = 0; k < len_b; k++) { // 使a的每一位与b的每一位都可以相乘上
            c[i + k] += a[i] * b[k]; // 在这个里请把c[i+k]看作整体方便理解
            if (c[i + k] >= 10) {
                c[i + k + 1] += c[i + k] / 10;
                c[i + k] = c[i + k] % 10;
            }//老套路哩
        }
    }
    int len_c = len_a + len_b;
    if (c[len_c]) len_c++; // 老套路 用于计算输出范围的
    while (c[len_c - 1] == 0 && len_c > 1) len_c--; // 解决你输出一堆0的问题 比如 1 * 0
    for (int i = 0; i < len_c; i++) {
        cout << c[len_c -i-1];
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值