C语言实现大整数加减乘除运算 - 优化数组表示与算法
#include <stdio.h>\n#include <string.h>\n\n#define MAX_DIGITS 50\n\nvoid reverse(char *str) {\n int len = strlen(str);\n for (int i = 0; i < len / 2; i++) {\n char temp = str[i];\n str[i] = str[len - i - 1];\n str[len - i - 1] = temp;\n }\n}\n\nvoid add(char *num1, char *num2, char *result) {\n int carry = 0;\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n int len = len1 > len2 ? len1 : len2;\n\n for (int i = 0; i < len; i++) {\n int digit1 = i < len1 ? num1[i] - '0' : 0;\n int digit2 = i < len2 ? num2[i] - '0' : 0;\n int sum = digit1 + digit2 + carry;\n result[i] = sum % 10 + '0';\n carry = sum / 10;\n }\n\n if (carry) {\n result[len] = carry + '0';\n len++;\n }\n\n result[len] = '\0';\n reverse(result);\n}\n\nvoid subtract(char *num1, char *num2, char *result) {\n int borrow = 0;\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n int len = len1 > len2 ? len1 : len2;\n\n for (int i = 0; i < len; i++) {\n int digit1 = i < len1 ? num1[i] - '0' : 0;\n int digit2 = i < len2 ? num2[i] - '0' : 0;\n int diff = digit1 - digit2 - borrow;\n\n if (diff < 0) {\n diff += 10;\n borrow = 1;\n } else {\n borrow = 0;\n }\n\n result[i] = diff + '0';\n }\n\n while (len > 1 && result[len - 1] == '0') {\n len--;\n }\n\n result[len] = '\0';\n reverse(result);\n}\n\nvoid multiply(const char *num1, const char *num2, char *result) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n int len = len1 + len2;\n\n int *digits = calloc(len, sizeof(int));\n\n for (int i = len1 - 1; i >= 0; i--) {\n for (int j = len2 - 1; j >= 0; j--) {\n int digit1 = num1[i] - '0';\n int digit2 = num2[j] - '0';\n digits[i + j + 1] += digit1 * digit2;\n }\n }\n\n int carry = 0;\n for (int i = len - 1; i >= 0; i--) {\n int sum = digits[i] + carry;\n result[i] = sum % 10 + '0';\n carry = sum / 10;\n }\n\n while (len > 1 && result[len - 1] == '0') {\n len--;\n }\n\n result[len] = '\0';\n reverse(result);\n\n free(digits);\n}\n\nvoid divide(const char *num1, const char *num2, char *result) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n\n if (len1 < len2) {\n strcpy(result, "0");\n return;\n }\n\n char *dividend = strdup(num1);\n char *divisor = strdup(num2);\n char quotient[MAX_DIGITS];\n char temp[MAX_DIGITS];\n\n memset(quotient, '0', sizeof(quotient));\n quotient[len1 - len2] = '\0';\n\n for (int i = len1 - len2; i >= 0; i--) {\n while (strcmp(dividend, divisor) >= 0) {\n subtract(dividend, divisor, temp);\n strcpy(dividend, temp);\n quotient[i]++;\n }\n\n divisor[len2] = '\0';\n strcat(divisor, "0");\n }\n\n strcpy(result, quotient);\n\n free(dividend);\n free(divisor);\n}\n\nint main() {\n char num1[MAX_DIGITS] = "12345678901234567890";\n char num2[MAX_DIGITS] = "98765432109876543210";\n char result[MAX_DIGITS];\n\n add(num1, num2, result);\n printf("%s + %s = %s\n", num1, num2, result);\n\n subtract(num1, num2, result);\n printf("%s - %s = %s\n", num1, num2, result);\n\n multiply(num1, num2, result);\n printf("%s * %s = %s\n", num1, num2, result);\n\n divide(num1, num2, result);\n printf("%s / %s = %s\n", num1, num2, result);\n\n return 0;\n}\n\n该实现中,add 函数实现了大整数的加法,subtract 函数实现了大整数的减法,multiply 函数实现了大整数的乘法,divide 函数实现了大整数的除法。\n\n这个程序使用了一个数组 result 来存储计算结果,同时也使用了字符串处理函数来简化操作。为了提高效率,程序在处理过程中尽可能减少字符串的拷贝操作,而是直接在原数组上进行修改。
原文地址: https://www.cveoy.top/t/topic/pxhu 著作权归作者所有。请勿转载和采集!