高精度计算在最近几天上去,现贴上的只有高精度阶乘、加法、减法,加减法支持负数及小数,阶乘最多支持10000位,要增加请更改a数组的大小,加减法最多支持100位,若要修改,修改MAXN的大小
// 趣味C.cpp : 定义控制台应用程序的入口点。 // 高精度的总结~ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <memory.h> #define MAXN 100 void addition(char *num1, char *num2); void Subtract(char *num1, char *num2); // 阶乘 void fact(int n) { int a[10000]; int nBit = 1; // 位数 int temp; // 阶数的任一元素与临时结果的某位的乘积结果 int i, j, carry; // 进位 // 从1*2开始 a[0] = 1; for (i = 2; i <= n; i++) { carry = 0; // 每次算完都把进位清零 for (j = 0; j < nBit; j++) // 按被乘数的位数来循环 { temp = a[j] * i + carry; a[j] = temp % 10; carry = temp / 10; // 存进位 } // 如果有进位digit位数就相加 while (carry) { ++nBit; a[nBit - 1] = carry % 10; // 存进位 carry /= 10; // 看还能不能进位 } } printf("%d! = ", n); for (j = nBit; j >= 1; j--) printf("%d", a[j-1]); printf("/n/n"); } // 初始化数据 void InitData(char *num1, char *num2) { // 计算小数点的位置 size_t PosDotNum1 = 0, PosDotNum2 = 0; int i, diff; for (i = 0; num1[i] != '.' && num1[i] != '/0'; i++) PosDotNum1++; if (num1[i] == '/0') { num1[i] = '.'; num1[i + 1] = '/0'; } for (i = 0; num2[i] != '.' && num2[i] != '/0'; i++) PosDotNum2++; if (num2[i] == '/0') { num2[i] = '.'; num2[i + 1] = '/0'; } // 使两个数的小数点对齐 if (PosDotNum1 < PosDotNum2) { diff = PosDotNum2 - PosDotNum1; for (i = strlen(num1); i >= 0; i--) num1[i + diff] = num1[i]; // 前导补0 for (i = 0; i < diff; i++) num1[i] = '0'; } else if (PosDotNum2 < PosDotNum1) { diff = PosDotNum1 - PosDotNum2; for (i = strlen(num2); i >= 0; i--) num2[i + diff] = num2[i]; // 前导补0 for (i = 0; i < diff; i++) num2[i] = '0'; } // 后继补0 for (i = strlen(num1); i < MAXN - 1; i++) num1[i] = '0'; num1[MAXN - 1] = '/0'; for (i = strlen(num2); i < MAXN - 1; i++) num2[i] = '0'; num2[MAXN - 1] = '/0'; } // 打印结果 void PrintResult(char *num) { int i, n; for (i = 0; num[i] == '0'; i++) ; // 去除后继零 for (n = MAXN - 1; num[n] == '0'; n--) ; if (-1 == n) { printf("0/n"); return; } if ('.' == num[n]) num[n] = '/0'; else num[n + 1] = '/0'; if ('.' == num[i]) i--; for (; num[i] != '/0'; i++) printf("%c", num[i]); printf("/n"); } // 高精度加法 void addition(char *num1, char *num2) { char result[MAXN + 1]; int i, temp; if ('-' == num1[0] && num2[0] != '-') { Subtract(num2, num1 + 1); return; } else if (num1[0] != '-' && num2[0] == '-') { Subtract(num1, num2 + 1); return; } else if (num1[0] == '-' && num2[0] == '-') { printf("-"); addition(num1 + 1, num2 + 1); return; } // 初始化两个加数与和 InitData(num1, num2); memset(result, '0', sizeof(result) / sizeof(char)); result[MAXN] = '/0'; // 计算和 for (i = MAXN - 2; i >= 0; i--) { if ('.' == num1[i]) { result[i + 1] = '.'; continue; } temp = (result[i + 1] - '0') + (num1[i] - '0') + (num2[i] - '0'); result[i + 1] = temp % 10 + '0'; if ('.' == num1[i - 1] && (temp / 10)) result[i - 1] += temp / 10; result[i] += temp / 10; } // 打印结果 PrintResult(result); } // 高精度减法 void Subtract(char *num1, char *num2) { char result[MAXN + 1]; char temp1[MAXN], temp2[MAXN]; int i, temp; if (num1[0] == '-' && num2[0] != '-') { printf("-"); addition(num1 + 1, num2); return; } else if (num1[0] != '-' && num2[0] == '-') { strcpy(temp2, num2 + 1); addition(num1, temp2); return; } else if (num1[0] == '-' && num2[0] == '-') { strcpy(temp1, num1 + 1); strcpy(temp2, num2 + 1); Subtract(temp1, temp2); return; } // 初始化两个减数与差 InitData(num1, num2); memset(result, '0', sizeof(result) / sizeof(char)); result[MAXN] = '/0'; if (strcmp(num1, num2) < 0) { printf("-"); Subtract(num2, num1); return; } // 计算差 for (i = MAXN - 2; i >= 0; i--) { if ('.' == num1[i]) { result[i + 1] = '.'; continue; } temp = (num1[i] - '0') - (num2[i] - '0'); if (temp < 0 && i > 0) { temp += 10; if ('.' == num1[i - 1]) num1[i - 2]--; else num1[i - 1]--; } result[i + 1] = temp + '0'; } // 打印计算结果 PrintResult(result); } // 高精度乘法计算 void multiply(char *num1, char *num2) { } int main(int argc, char* argv[]) { int sel; int n; char num1[MAXN], num2[MAXN]; printf("===========================================/n"); printf(" 欢迎使用高精度计算器 Dos版 VS.JQCTBU/n"); printf("===========================================/n"); while (1) { printf("/n/n1.阶乘/n"); printf("2.加法/n"); printf("3.减法/n"); printf("4.乘法/n"); printf("5.除法/n"); printf("6.多项式计算(简单)/n"); printf("7.多项式计算(高精度)/n"); printf("0.退出/n/n"); printf("请输入你的选择:"); scanf("%d", &sel); num1[0] = num2[0] = '/0'; switch (sel) { case 1: printf("/n请输入一个数:/n"); scanf("%d", &n); fact(n); break; case 2: printf("/n请输入两个数/n第一个数:"); scanf("%s", num1); printf("第二个数:"); scanf("%s", num2); printf("%s + %s = /n", num1, num2); addition(num1, num2); break; case 3: printf("/n请输入两个数/n被减数:"); scanf("%s", num1); printf("减数:"); scanf("%s", num2); printf("%s - %s = /n", num1, num2); Subtract(num1, num2); break; case 4: printf("/n请输入两个需要相乘的数/n第一个数:"); scanf("%s", num1); printf("第二个数:"); scanf("%s", num2); multiply(num1, num2); break; case 0: exit(0); break; } } return 0; }