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 i = 0;\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n \n while (i < len1 || i < len2) {\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 i++;\n }\n \n if (carry) {\n result[i] = carry + '0';\n i++;\n }\n \n result[i] = '\0';\n reverse(result);\n}\n\nvoid subtract(char *num1, char *num2, char *result) {\n int borrow = 0;\n int i = 0;\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n \n while (i < len1 || i < len2) {\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 i++;\n }\n \n result[i] = '\0';\n reverse(result);\n}\n\nvoid multiply(char *num1, char *num2, char *result) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n \n int *temp = calloc(len1 + len2, 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 \n temp[i + j + 1] += digit1 * digit2;\n }\n }\n \n int carry = 0;\n \n for (int i = len1 + len2 - 1; i >= 0; i--) {\n int sum = temp[i] + carry;\n result[i] = sum % 10 + '0';\n carry = sum / 10;\n }\n \n result[len1 + len2] = '\0';\n reverse(result);\n \n free(temp);\n}\n\nint compare(char *num1, char *num2) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n \n if (len1 > len2) {\n return 1;\n } else if (len1 < len2) {\n return -1;\n }\n \n for (int i = 0; i < len1; i++) {\n if (num1[i] > num2[i]) {\n return 1;\n } else if (num1[i] < num2[i]) {\n return -1;\n }\n }\n \n return 0;\n}\n\nvoid divide(char *num1, char *num2, char *quotient, char *remainder) {\n int len1 = strlen(num1);\n int len2 = strlen(num2);\n \n char *temp = calloc(len1 + 1, sizeof(char));\n \n for (int i = 0; i < len1; i++) {\n temp[i] = num1[i];\n \n while (compare(temp, num2) >= 0) {\n subtract(temp, num2, temp);\n add(quotient, "1", quotient);\n }\n }\n \n strcpy(remainder, temp);\n \n free(temp);\n}\n\nint main() {\n char num1[MAX_DIGITS];\n char num2[MAX_DIGITS];\n char result[MAX_DIGITS + 1];\n \n printf("Enter the first number: ");\n scanf("%s", num1);\n \n printf("Enter the second number: ");\n scanf("%s", num2);\n \n add(num1, num2, result);\n printf("Sum: %s\n", result);\n \n subtract(num1, num2, result);\n printf("Difference: %s\n", result);\n \n multiply(num1, num2, result);\n printf("Product: %s\n", result);\n \n char quotient[MAX_DIGITS];\n char remainder[MAX_DIGITS];\n \n divide(num1, num2, quotient, remainder);\n printf("Quotient: %s\n", quotient);\n printf("Remainder: %s\n", remainder);\n \n return 0;\n}\n
原文地址: https://www.cveoy.top/t/topic/pxgS 著作权归作者所有。请勿转载和采集!