C语言实现大整数四则运算 - 代码示例与原理详解
在C语言中,可以使用字符串来表示大整数,然后通过字符串的操作来进行四则运算。\n\n以下是一个示例代码,实现了大整数的加法、减法、乘法和除法运算:\n\nc\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n// 大整数的加法\nchar* add(char* num1, char* num2) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n int maxLen = len1 > len2 ? len1 : len2;\n char* result = (char*)malloc((maxLen + 2) * sizeof(char)); // +2是为了容纳进位和结束符'\0'\n int carry = 0; // 进位\n int i = len1 - 1, j = len2 - 1, k = maxLen;\n while (i >= 0 || j >= 0) {\n int n1 = i >= 0 ? num1[i--] - '0' : 0;\n int n2 = j >= 0 ? num2[j--] - '0' : 0;\n int sum = n1 + n2 + carry;\n result[k--] = sum % 10 + '0';\n carry = sum / 10;\n }\n if (carry > 0) {\n result[k--] = carry + '0';\n }\n result[maxLen + 1] = '\0';\n return result;\n}\n\n// 大整数的减法\nchar* subtract(char* num1, char* num2) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n int maxLen = len1 > len2 ? len1 : len2;\n char* result = (char*)malloc((maxLen + 1) * sizeof(char)); // +1是为了容纳结束符'\0'\n int borrow = 0; // 借位\n int i = len1 - 1, j = len2 - 1, k = maxLen - 1;\n while (i >= 0 || j >= 0) {\n int n1 = i >= 0 ? num1[i--] - '0' : 0;\n int n2 = j >= 0 ? num2[j--] - '0' : 0;\n int diff = n1 - n2 - borrow;\n if (diff < 0) {\n diff += 10;\n borrow = 1;\n } else {\n borrow = 0;\n }\n result[k--] = diff + '0';\n }\n result[maxLen] = '\0';\n return result;\n}\n\n// 大整数的乘法\nchar* multiply(char* num1, char* num2) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n int resultLen = len1 + len2;\n char* result = (char*)malloc((resultLen + 1) * sizeof(char)); // +1是为了容纳结束符'\0'\n memset(result, '0', resultLen);\n result[resultLen] = '\0';\n for (int i = len1 - 1; i >= 0; i--) {\n int n1 = num1[i] - '0';\n int carry = 0;\n for (int j = len2 - 1; j >= 0; j--) {\n int n2 = num2[j] - '0';\n int mul = n1 * n2 + carry + (result[i + j + 1] - '0');\n carry = mul / 10;\n result[i + j + 1] = mul % 10 + '0';\n }\n result[i] += carry;\n }\n if (result[0] == '0') {\n return result + 1;\n }\n return result;\n}\n\n// 大整数的除法\nchar* divide(char* num1, char* num2) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n if (len1 < len2 || (len1 == len2 && strcmp(num1, num2) < 0)) {\n char* result = (char*)malloc(2 * sizeof(char));\n result[0] = '0';\n result[1] = '\0';\n return result;\n }\n char* result = (char*)malloc((len1 - len2 + 2) * sizeof(char)); // +2是为了容纳商和结束符'\0'\n result[len1 - len2 + 1] = '\0';\n char* remainder = (char*)malloc((len1 + 1) * sizeof(char)); // +1是为了容纳余数和结束符'\0'\n remainder[len1] = '\0';\n strncpy(remainder, num1, len2 - 1);\n for (int i = len2 - 1; i < len1; i++) {\n remainder[len2 - 1] = num1[i];\n remainder[len2] = '\0';\n int quotient = 0;\n while (strcmp(remainder, num2) >= 0) {\n quotient++;\n char* temp = subtract(remainder, num2);\n strcpy(remainder, temp);\n free(temp);\n }\n result[i - len2 + 1] = quotient + '0';\n }\n free(remainder);\n if (result[0] == '0') {\n char* temp = result;\n result = result + 1;\n free(temp);\n }\n return result;\n}\n\nint main() {\n char num1[] = "12345678901234567890";\n char num2[] = "98765432109876543210";\n\n // 加法\n char* sum = add(num1, num2);\n printf("Sum: %s\n", sum);\n free(sum);\n\n // 减法\n char* difference = subtract(num1, num2);\n printf("Difference: %s\n", difference);\n free(difference);\n\n // 乘法\n char* product = multiply(num1, num2);\n printf("Product: %s\n", product);\n free(product);\n\n // 除法\n char* quotient = divide(num1, num2);\n printf("Quotient: %s\n", quotient);\n free(quotient);\n\n return 0;\n}\n\n\n这段代码首先定义了四个函数,分别实现了大整数的加法、减法、乘法和除法运算。然后在main函数中,调用这些函数进行测试。\n\n需要注意的是,由于大整数可能非常大,超出了int或long long的表示范围,因此采用字符串表示大整数,并通过字符串的操作来进行运算。同时,为了方便内存管理,需要在适当的时候使用malloc函数分配内存,并在不需要使用时使用free函数释放内存。
原文地址: https://www.cveoy.top/t/topic/pxxF 著作权归作者所有。请勿转载和采集!