C语言实现大整数四则运算:算法与优化
实现大整数的四则运算可以使用数组来表示大整数,并根据运算规则进行相应的操作。以下是一个简单的实现示例:\n\nc\n#include <stdio.h>\n#include <string.h>\n\n#define MAX_LEN 50\n\n// 大整数结构体\ntypedef struct {\n int len; // 数字的位数\n int digits[MAX_LEN]; // 数字数组,从低位到高位存储\n} BigNumber;\n\n// 初始化大整数为0\nvoid initBigNumber(BigNumber *num) {\n num->len = 0;\n memset(num->digits, 0, sizeof(num->digits));\n}\n\n// 从字符串中读取大整数\nvoid readBigNumber(BigNumber *num, const char *str) {\n int len = strlen(str);\n num->len = len;\n for (int i = 0; i < len; i++) {\n num->digits[i] = str[len - 1 - i] - '0';\n }\n}\n\n// 打印大整数\nvoid printBigNumber(const BigNumber *num) {\n for (int i = num->len - 1; i >= 0; i--) {\n printf("%d", num->digits[i]);\n }\n printf("\n");\n}\n\n// 大整数相加\nvoid addBigNumber(const BigNumber *num1, const BigNumber *num2, BigNumber *result) {\n int carry = 0; // 进位\n int len = num1->len > num2->len ? num1->len : num2->len; // 结果的位数取较大的一个\n for (int i = 0; i < len; i++) {\n int sum = num1->digits[i] + num2->digits[i] + carry;\n result->digits[i] = sum % 10; // 当前位的值\n carry = sum / 10; // 进位\n }\n if (carry > 0) {\n result->digits[len] = carry;\n result->len = len + 1;\n } else {\n result->len = len;\n }\n}\n\n// 大整数相减\nvoid subtractBigNumber(const BigNumber *num1, const BigNumber *num2, BigNumber *result) {\n int borrow = 0; // 借位\n int len = num1->len; // 结果的位数与被减数相同\n for (int i = 0; i < len; i++) {\n int diff = num1->digits[i] - num2->digits[i] - borrow;\n if (diff < 0) {\n diff += 10;\n borrow = 1;\n } else {\n borrow = 0;\n }\n result->digits[i] = diff;\n }\n while (len > 0 && result->digits[len - 1] == 0) {\n len--; // 去掉高位的0\n }\n result->len = len;\n}\n\n// 大整数相乘\nvoid multiplyBigNumber(const BigNumber *num1, const BigNumber *num2, BigNumber *result) {\n int len1 = num1->len;\n int len2 = num2->len;\n for (int i = 0; i < len2; i++) {\n int carry = 0; // 进位\n for (int j = 0; j < len1; j++) {\n int product = num1->digits[j] * num2->digits[i] + carry + result->digits[i + j];\n result->digits[i + j] = product % 10; // 当前位的值\n carry = product / 10; // 进位\n }\n if (carry > 0) {\n result->digits[i + len1] = carry;\n }\n }\n int len = len1 + len2;\n while (len > 0 && result->digits[len - 1] == 0) {\n len--; // 去掉高位的0\n }\n result->len = len;\n}\n\n// 大整数相除\nvoid divideBigNumber(const BigNumber *num1, const BigNumber *num2, BigNumber *result) {\n BigNumber dividend, divisor, quotient, remainder;\n initBigNumber(÷nd);\n initBigNumber(&divisor);\n initBigNumber("ient);\n initBigNumber(&remainder);\n // 复制被除数和除数\n dividend = *num1;\n divisor = *num2;\n int len1 = dividend.len;\n int len2 = divisor.len;\n // 初始化商和余数的位数\n quotient.len = len1 - len2 + 1;\n remainder.len = len1;\n // 从高位到低位逐位相除\n for (int i = len1 - len2; i >= 0; i--) {\n int q = 0; // 当前位的商\n while (compareBigNumber(÷nd, &divisor) >= 0) {\n subtractBigNumber(÷nd, &divisor, ÷nd);\n q++;\n }\n quotient.digits[i] = q;\n // 将除数右移一位\n for (int j = divisor.len - 1; j > 0; j--) {\n divisor.digits[j] = divisor.digits[j - 1];\n }\n divisor.digits[0] = 0;\n }\n // 去掉商和余数的高位的0\n while (quotient.len > 0 && quotient.digits[quotient.len - 1] == 0) {\n quotient.len--;\n }\n while (remainder.len > 0 && remainder.digits[remainder.len - 1] == 0) {\n remainder.len--;\n }\n *result = quotient;\n}\n\n// 比较两个大整数的大小,返回-1表示num1 < num2,0表示num1 = num2,1表示num1 > num2\nint compareBigNumber(const BigNumber *num1, const BigNumber *num2) {\n if (num1->len < num2->len) {\n return -1;\n } else if (num1->len > num2->len) {\n return 1;\n } else {\n for (int i = num1->len - 1; i >= 0; i--) {\n if (num1->digits[i] < num2->digits[i]) {\n return -1;\n } else if (num1->digits[i] > num2->digits[i]) {\n return 1;\n }\n }\n return 0;\n }\n}\n\nint main() {\n BigNumber num1, num2, result;\n char str1[MAX_LEN + 1], str2[MAX_LEN + 1];\n printf("请输入第一个大整数:");\n scanf("%s", str1);\n printf("请输入第二个大整数:");\n scanf("%s", str2);\n initBigNumber(&num1);\n initBigNumber(&num2);\n initBigNumber(&result);\n readBigNumber(&num1, str1);\n readBigNumber(&num2, str2);\n printf("加法结果:");\n addBigNumber(&num1, &num2, &result);\n printBigNumber(&result);\n printf("减法结果:");\n subtractBigNumber(&num1, &num2, &result);\n printBigNumber(&result);\n printf("乘法结果:");\n multiplyBigNumber(&num1, &num2, &result);\n printBigNumber(&result);\n printf("除法结果:");\n divideBigNumber(&num1, &num2, &result);\n printBigNumber(&result);\n return 0;\n}\n\n\n上述代码中,使用BigNumber结构体来表示大整数,其中len表示数字的位数,digits数组存储实际的数字,从低位到高位存储。通过函数initBigNumber来初始化大整数,readBigNumber从字符串中读取大整数,printBigNumber打印大整数。\n\n然后,实现了大整数的加法addBigNumber、减法subtractBigNumber、乘法multiplyBigNumber和除法divideBigNumber。这些函数通过逐位计算并考虑进位或借位来进行运算。\n\n最后,在main函数中,用户输入两个大整数,然后调用上述函数进行四则运算,并打印结果。\n\n这是一个简单的实现示例,你可以根据实际需求进行优化和改进。例如,可以处理负数和小数,增加更多的错误处理和边界检查等。
原文地址: https://www.cveoy.top/t/topic/pxe3 著作权归作者所有。请勿转载和采集!