自己写的大数相乘

本文介绍了一段使用C++实现的代码,包括字符串反转和字符串相乘的功能。通过定义特殊函数实现字符串的反转操作,然后利用自定义的乘法函数对反转后的字符串进行数字转换并计算乘积。代码逻辑清晰,适合初学者理解和实践。
摘要由CSDN通过智能技术生成

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>


using namespace std;
const int g_kMaxs = 1001;


char g_a[g_kMaxs], g_b[g_kMaxs];


void StrRes(char* str) {
    int len = strlen(str);
    int i = 0, j = len - 1;
    while (i < j) {
        char c = str[i];
        str[i] = str[j];
        str[j] = c;
        ++i;
        --j;
    }
}


int* Mul(char* lhs, char* rhs) {
    if (NULL == lhs || NULL == rhs) { // 为空则出错,其他的需要假设保证输入没有问题
        fprintf(stderr, "Nul: Invalid arguments");
        exit(1);
    }


    int lhsLen = (int)strlen(lhs);
    int rhsLen = (int)strlen(rhs);
    int* ret = new int[lhsLen + rhsLen + 1];
    // 两个数相乘之积的位数不会超过两个数的位数之和,
    // 而申请多一位是把积的长度绝对值放在ret[0]中,并用ret[0]的正负代表积的正负
    memset(ret, 0, sizeof(int)*(lhsLen + rhsLen + 1));
    if ((isdigit(lhs[0]) && isdigit(rhs[0])) || (lhs[0] == '-' && rhs[0] == '-')) {
        ret[0] = 1;
    } else ret[0] = -1;
    if (lhs[0] == '-') --lhsLen;
    if (rhs[0] == '-') --rhsLen;


    StrRes(lhs); //把输入的数字串反转
    StrRes(rhs);


    for (int i = 0; i < lhsLen; i++) {
        for (int j = 0; j < rhsLen; j++) {
            ret[i + j + 1] += ((lhs[i] - '0') * (rhs[j] - '0')) % 10;
            ret[i + j + 2] += ((lhs[i] - '0') * (rhs[j] - '0')) / 10;
        }
    }
    StrRes(lhs); //把输入的数字串反转恢复
    StrRes(rhs);
    if (ret[0] < 0) printf("-"); // ret[0] < 0 为负数
    ret[0] = ret[0] * ((ret[lhsLen + rhsLen] > 0) ? (lhsLen + rhsLen) : (lhsLen + rhsLen - 1));
    for (int i = abs(ret[0]); i >= 1; i--) printf("%d", ret[i]);
    printf("\n");
    return ret;
}


int main()
{
    while (EOF != scanf("%s%s", g_a, g_b)) {
        Mul(g_a, g_b);
    }
    return 0;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值