大整数乘法运算

cpp 复制代码
//
// Created by Administrator on 2026/3/28.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 1000  // 大整数支持的最大位数

// 大整数结构体定义(与教材完全一致)
typedef struct {
    int digits[MAXSIZE]; // 低位到高位依次存储,digits[0] 是个位
    int length;          // 有效数字位数
    int sign;            // 符号:1 为正,-1 为负
} BigInt;

// ------------------- 1. 字符串转大整数 -------------------
BigInt StrToBigInt(const char *s) {
    BigInt num;
    num.length = 0;
    num.sign = 1;

    int len = strlen(s);
    int i = 0;
    if (s[0] == '-') {
        num.sign = -1;
        i = 1;
    }

    // 从后往前读,低位存到数组前面
    for (int j = len - 1; j >= i; j--) {
        num.digits[num.length++] = s[j] - '0';
    }

    return num;
}

// ------------------- 2. 打印大整数 -------------------
void PrintBigInt(BigInt num) {
    if (num.length == 0) {
        printf("0\n");
        return;
    }

    if (num.sign == -1) {
        printf("-");
    }

    // 从高位到低位打印
    for (int i = num.length - 1; i >= 0; i--) {
        printf("%d", num.digits[i]);
    }
    printf("\n");
}

// ------------------- 3. 大整数乘法(教材伪代码实现) -------------------
BigInt BigIntMultiply(BigInt a, BigInt b) {
    BigInt c;

    // 1. 处理结果为0的特殊情况
    if (a.length == 0 || b.length == 0) {
        c.sign = 1;
        c.length = 0;
        return c;
    }

    // 2. 判断结果的符号位
    if (a.sign == b.sign) {
        c.sign = 1;
    } else {
        c.sign = -1;
    }

    // 3. 确定结果的位数,并初始化
    c.length = a.length + b.length - 1;
    for (int i = 0; i < c.length; i++) {
        c.digits[i] = 0;
    }

    // 4. 按位相乘并累加
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < b.length; j++) {
            c.digits[i + j] += a.digits[i] * b.digits[j];
        }
    }

    // 5. 从低位到高位处理进位
    int carry = 0;
    for (int i = 0; i < c.length; i++) {
        int temp = c.digits[i] + carry;
        c.digits[i] = temp % 10;
        carry = temp / 10;
    }

    // 6. 处理最高位进位
    if (carry > 0) {
        c.digits[c.length++] = carry;
    }

    // 7. 消除高位前导0
    while (c.length > 0 && c.digits[c.length - 1] == 0) {
        c.length--;
    }

    return c;
}

// ------------------- 测试主函数 -------------------
int main() {
    // 测试用例1:正数相乘 123 × 456 = 56088
    BigInt a = StrToBigInt("123");
    BigInt b = StrToBigInt("456");
    printf("a = "); PrintBigInt(a);
    printf("b = "); PrintBigInt(b);
    BigInt product = BigIntMultiply(a, b);
    printf("a × b = "); PrintBigInt(product);

    // 测试用例2:带负数相乘 -123 × 456 = -56088
    BigInt c = StrToBigInt("-123");
    printf("\nc = "); PrintBigInt(c);
    printf("b = "); PrintBigInt(b);
    BigInt product2 = BigIntMultiply(c, b);
    printf("c × b = "); PrintBigInt(product2);

    // 测试用例3:乘以0 999 × 0 = 0
    BigInt d = StrToBigInt("999");
    BigInt zero = StrToBigInt("0");
    printf("\nd = "); PrintBigInt(d);
    printf("zero = "); PrintBigInt(zero);
    BigInt product3 = BigIntMultiply(d, zero);
    printf("d × zero = "); PrintBigInt(product3);

    return 0;
}

两数相乘,其结果的位数至少是两数位数之和-1.

乘法思想:个位乘个位算个位,个位累加。

个位乘百位算百位,百位乘个位算百位,十位乘十位算百位。百位累加。

相关推荐
wuminyu6 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
GreenTea7 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
Blockbuater_drug7 小时前
FreeSASA: 开源 SASA 计算库,pip 一条命令替代 NACCESS
c语言·开源·sasa·freesasa·溶剂可及表面积·naccess·python api
Bode_20027 小时前
多资源规划(含生产调度、库存管理及产能规划)的创新优化算法
算法·调度
Logic1018 小时前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
土司大王8 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹8 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王8 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
Logic1019 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
罗西的思考9 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习