大整数乘法运算
// // 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.乘法思想个位乘个位算个位个位累加。个位乘百位算百位百位乘个位算百位十位乘十位算百位。百位累加。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2466207.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!