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.
乘法思想:个位乘个位算个位,个位累加。
个位乘百位算百位,百位乘个位算百位,十位乘十位算百位。百位累加。