发布网友 发布时间:2022-05-01 22:58
共1个回答
热心网友 时间:2022-06-24 16:03
#include <stdio.h> #include <string.h> #define MAXCHAR 20000 void Add (char *ch1 , char *ch2 , char *ch3) {// ch3 = ch1 + ch2; int len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , i , tmp , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=len1-1;i>=0;i--) num1[len1-1-i] = ch1[i] - 48; for (i=len2-1;i>=0;i--) num2[len2-1-i] = ch2[i] - 48; i = 0 , tmp = 0 , len3 = len1 > len2 ? len1 : len2; while (i < len3) { num3[i] = num1[i] + num2[i] + tmp; tmp = 0; if (num3[i] >= 10) { tmp = num3[i]/10; num3[i] %= 10; } i ++; } if (tmp != 0) { num3[i] = tmp; i ++; } len3 = i; for (i=len3-1;i>=0;i--) ch3[len3-1-i] = num3[i] + 48; ch3[len3] = '\0'; return ; } void Minus (char *ch1 , char *ch2 , char *ch3) { // 保证 ch1 > ch2 : ch3 = ch1 - ch2 int i , tmp , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=0;i<len1;i++) num1[len1-1-i] = ch1[i] - 48; for (i=0;i<len2;i++) num2[len2-1-i] = ch2[i] - 48; i = 0 , tmp = 0 , len3 = len1 > len2 ? len1 : len2; while (i < len3) { num3[i] = num1[i] - num2[i] - tmp; if (num3[i] < 0) { num3[i] += 10 , tmp = 1; } else tmp = 0; i ++; } while (len3 > 1 && num3[len3-1] == 0) len3 --; for (i=0;i<len3;i++) ch3[i] = num3[len3-1-i] + 48; ch3[len3] = '\0'; return ; } void MUL (char *ch1 , char *ch2 , char *ch3) {// ch3 = ch1*ch2; int i , j , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , tmp , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=len1-1;i>=0;i--) num1[len1-1-i] = ch1[i] - 48; for (i=len2-1;i>=0;i--) num2[len2-1-i] = ch2[i] - 48; for (i=0;i<len1;i++) { tmp = 0; for (j=0;j<len2;j++) { num3[i+j] += num1[i]*num2[j] + tmp; tmp = 0; if (num3[i+j] >= 10) { tmp = num3[i+j]/10; num3[i+j] %= 10; } } while (tmp != 0) { num3[i+j] += tmp; tmp = num3[i+j]/10; j ++; } } len3 = len1+len2; while (len3 > 1 && num3[len3-1] == 0) len3 --; for (i=0;i<len3;i++) ch3[len3-1-i] = num3[i] + 48; ch3[len3] = '\0'; return ; } int cmp (char *ch1 , char *ch2) {// ch1 > ch2 return 1; ch1 < ch2 return -1; ch1 == ch2 return 0; int i , len1 = strlen (ch1) , len2 = strlen (ch2); if (len1 > len2) return 1; if (len2 > len1) return -1; for (i=0;i<len1;i++) { if (ch1[i] > ch2[i]) return 1; if (ch1[i] < ch2[i]) return -1; } return 0; } void Div (char *ch1 , char *ch2 , char *ch3) {//保证ch1>ch2 && ch2 != 0 : ch3 = ch1/ch2 , ch1 = ch1%ch2 , 需要支持函数:cmp () , Minus (); int i , len1 , len2 , tmp; char ch4[MAXCHAR] , ch5[MAXCHAR]; ch3[0] = '0' , ch3[1] = '\0'; while (cmp (ch1 , ch2) >= 0) { len1 = strlen (ch1) , len2 = strlen (ch2); tmp = len1-len2-1 > 0 ? len1-len2-1 : 0; ch4[0] = '1'; memcpy (ch5 , ch2 , (len2+1)*sizeof(char)); for (i=0;i<tmp;i++) { ch4[1+i] = '0' , ch5[len2+i] = '0'; } ch4[1+i] = '\0'; ch5[len2+i] = '\0'; Add (ch3 , ch4 , ch3); // ch3 += ch4; Minus (ch1 , ch5 , ch1); // ch1 -= ch5; } return ;} void Mod (char *ch1 , char *ch2) {// 保证ch1 >= ch2 : ch1 %= ch2 , 需要支持函数:Minus () , cmp (); int i , len1 , len2 , tmp; char ch3[MAXCHAR]; while (cmp (ch1 , ch2) >= 0) { len1 = strlen (ch1) , len2 = strlen (ch2); tmp = len1-len2-1 > 0 ? len1-len2-1 : 0; memcpy (ch3 , ch2 , (len2+1)*sizeof(char)); for (i=0;i<tmp;i++) ch3[len2 + i] = '0'; ch3[len2 + i] = '\0'; Minus (ch1 , ch3 , ch1); } return ; } int main () { char ch1[MAXCHAR] , ch2[MAXCHAR] , ch3[MAXCHAR]; while (scanf ("\n%s %s" , ch1 , ch2) != EOF) { Add(ch1,ch2,ch3); printf ("两数之和:%s\n" , ch3); Minus(ch1,ch2,ch3); printf ("两数之差:%s\n" , ch3); MUL(ch1,ch2,ch3); printf ("两数之积:%s\n" , ch3); Div(ch1,ch2,ch3); printf ("两数之商:%s\n" , ch3); } return 0; } 我的高精度模版。