博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高精度模板(含加减乘除四则运算)
阅读量:7007 次
发布时间:2019-06-28

本文共 16231 字,大约阅读时间需要 54 分钟。

 

高精度加高精度

1 void BigAddBig(char *a, char *b, char *c) 2 { 3     //a表示结果,b,c位加数 4     int a_int[1005] = { 0 }, b_int[1005] = { 0 }, c_int[1005] = { 0 }; 5     int len1, len2, len, i; 6     len1 = strlen(b); 7     len2 = strlen(c); 8     for (i = 0; i < len1; i++) 9         b_int[i] = b[len1 - 1 - i] - '0';10     for (i = 0; i
len2 ? len1 : len2;13 for (i = 0; i
9)17 {18 a_int[i + 1] = a_int[i] / 10;19 a_int[i] = a_int[i] % 10;20 }21 }22 if (a_int[i] != 0)23 len++;24 while (!a_int[len - 1])25 len--;26 for (i = 0; i < len; i++)27 a[i] = a_int[len - 1 - i] + '0';28 a[i] = '\0';29 }
View Code

 

高精度减高精度(未经过严格测试)

1 void BigSubBig(char *a, char *b, char *c) 2 { 3     //a表示结果,b被减数,c减数,不能得到负数,需要进入函数之前判断 4     int a_int[1005] = { 0 }, b_int[1005] = { 0 }, c_int[1005] = { 0 }; 5     int len1, len2, len, i, owe; 6     len1 = strlen(b); 7     len2 = strlen(c); 8     for (i = 0; i < len1; i++) 9         b_int[i] = b[len1 - 1 - i] - '0';10     for (i = 0; i
len2 ? len1 : len2;13 owe = 0;14 for (i = 0; i < len; i++)15 {16 a_int[i] = b_int[i] - c_int[i] - owe;17 owe = 0;18 if (a_int[i] < 0)19 {20 owe = 1;21 a_int[i] = a_int[i] + 10;22 }23 }24 while (a_int[len - 1] == 0 && len != 1)25 len--;26 for (i = 0; i < len; i++)27 a[i] = a_int[len - 1 - i] + '0';28 a[i] = '\0';29 }
View Code

 

高精度乘以低精度

1 void BigNumMultiSmall(char *a, char *b, int mul) 2 { 3     //a表示结果,b表示被乘数,mul表示乘数 4     int i, j, len; 5     int a_int[2000] = { 0 }, b_int[1000] = { 0 }; 6     len = strlen(b); 7     for (i = 0; i < len; i++) 8         b_int[i] = b[len - 1 - i] - '0'; 9     for (i = 0; i
9)13 {14 a_int[i + 1] = a_int[i] / 10;15 a_int[i] = a_int[i] % 10;16 }17 }18 while (a_int[i])19 {20 a_int[i + 1] = a_int[i] / 10;21 a_int[i] = a_int[i] % 10;22 i++;23 }24 while (a_int[i - 1] == 0)25 i--;26 for (j = 0; j < i; j++)27 a[j] = a_int[i - j - 1] + '0';28 a[j] = '\0';29 }
View Code

 

高精度乘以高精度

1 void BigMultiBig(char *a, char *b, char *c) 2 { 3     int i, j, len1, len2, len; 4     int a_int[2010] = { 0 }, b_int[1000] = { 0 }, c_int[1000] = { 0 }; 5  6     len1 = strlen(b); 7     for (i = len1 - 1; i >= 0; i--) 8         b_int[len1 - i - 1] = b[i] - '0'; 9     len2 = strlen(c);10     for (i = len2 - 1; i >= 0; i--)11         c_int[len2 - i - 1] = c[i] - '0';12 13     len = len1 + len2;14 15     for (i = 0; i < len1; i++)16     for (j = 0; j < len2; j++)17         a_int[i + j] += b_int[i] * c_int[j];18     for (i = 0; i
9)20 {21 a_int[i + 1] += a_int[i] / 10;22 a_int[i] = a_int[i] % 10;23 }24 while (a_int[len - 1] == 0)25 len--;26 27 for (i = 0; i < len; i++)28 a[i] = a_int[len - i - 1] + '0';29 a[i] = '\0';30 if (strlen(a) == 0)31 strcpy(a, "0");32 }
View Code

 

高精度除以低精度

1 int BigNumDividSmall(char *a, char *b, int div) 2 { 3     //z是余数,a是结果,b是被除数,div是除数 4     int i, a_int[1000] = { 0 }, b_int[1000] = { 0 }; 5     int len = strlen(b); 6     for (i = 0; i < len; i++) 7         b_int[i] = b[i] - '0'; 8  9     int z = 0;10     for (i = 0; i < len; i++)11     {12         z = b_int[i] + z * 10;13         a_int[i] = z / div;14         z = z%div;15     }16 17     int t = 0;18     while (t < 1000 && !a_int[t])19         t++;20     if (t == 1000)21     {22         a[0] = '0';23         a[1] = '\0';24     }25     else26     {27         for (i = 0; i < len - t; i++)28             a[i] = a_int[i + t] + '0';29         a[i] = '\0';30     }31     return z;32 }
View Code

 

高精度除以高精度(未经过严格测试)

1 #include
2 #include
3 void BigSubBig(char *a, char *b, char *c) 4 { 5 //a表示结果,b被减数,c减数,不能得到负数,需要进入函数之前判断 6 int a_int[1005] = { 0 }, b_int[1005] = { 0 }, c_int[1005] = { 0 }; 7 int len1, len2, len, i, owe; 8 len1 = strlen(b); 9 len2 = strlen(c); 10 for (i = 0; i < len1; i++) 11 b_int[i] = b[len1 - 1 - i] - '0'; 12 for (i = 0; i
len2 ? len1 : len2; 15 owe = 0; 16 for (i = 0; i < len; i++) 17 { 18 a_int[i] = b_int[i] - c_int[i] - owe; 19 owe = 0; 20 if (a_int[i] < 0) 21 { 22 owe = 1; 23 a_int[i] = a_int[i] + 10; 24 } 25 } 26 while (a_int[len - 1] == 0 && len != 1) 27 len--; 28 for (i = 0; i
len2) 37 return 1; 38 if (len1 < len2) 39 return -1; 40 return strcmp(a, b); 41 } 42 void BigNumDividBig(char *a, char *arr, char *b, char *c) 43 { 44 45 char temp[1005], time[1005]; 46 int j, lentime, len, i, flag, k; 47 if (compare(b, c) == -1) 48 { 49 a[0] = '0'; 50 a[1] = '\0'; 51 strcpy(arr, b); 52 } 53 else if (compare(b, c) == 0) 54 { 55 a[0] = '1'; 56 a[1] = '\0'; 57 arr[0] = '0'; 58 arr[1] = '\0'; 59 } 60 else 61 { 62 j = lentime = 0; 63 len = strlen(b); 64 memset(temp, 0, sizeof(temp)); 65 memset(time, 0, sizeof(time)); 66 for (i = 0; i < len; i++) 67 {
//计算得到被除数的前几位,得到整型数组形式的商 68 //time的一个元素表示一次相除的商 69 temp[j++] = b[i]; 70 flag = 0; 71 while (compare(temp, c) >= 0) 72 { 73 BigSubBig(temp, temp, c); 74 time[lentime]++; 75 flag = 1;//控制time的元素的位置 76 } 77 if (flag)//将商转换为字符 78 time[lentime] += '0'; 79 else//当被除数前几位小于除数,商补 80 time[lentime] = '0'; 81 82 if (!strcmp(temp, "0"))//若temp为'' 83 j = 0; 84 else//继续在b的后面加值 85 j = strlen(temp); 86 lentime++; 87 } 88 k = 0; 89 for (i = 0; i < lentime; i++) 90 if (time[i] != '0') 91 break;//找到time数组中第一个不为的位置 92 for (j = i; j < lentime; j++) 93 a[k++] = time[j]; 94 if (i == lentime) 95 a[k++] = '0'; 96 a[k] = '\0'; 97 strcpy(arr, temp); 98 } 99 }100 int main()101 {102 char a[1005], b[1005], out[1005], arr[1005];103 while (scanf("%s%s", a, b) != EOF)104 {105 BigNumDividBig(out, arr, a, b);106 printf("%s\n", arr);107 }108 return 0;109 }110 111 112 113 //#include
114 //#include
115 //void BigSubBig(char *a, char *b, char *c)116 //{117 // //a表示结果,b被减数,c减数,不能得到负数,需要进入函数之前判断118 // int a_int[1005] = { 0 }, b_int[1005] = { 0 }, c_int[1005] = { 0 };119 // int len1, len2, len, i, owe;120 // len1 = strlen(b);121 // len2 = strlen(c);122 // for (i = 0; i < len1; i++)123 // b_int[i] = b[len1 - 1 - i] - '0';124 // for (i = 0; i
len2 ? len1 : len2;127 // owe = 0;128 // for (i = 0; i < len; i++)129 // {130 // a_int[i] = b_int[i] - c_int[i] - owe;131 // owe = 0;132 // if (a_int[i] < 0)133 // {134 // owe = 1;135 // a_int[i] = a_int[i] + 10;136 // }137 // }138 // while (a_int[len - 1] == 0 && len != 1)139 // len--;140 // for (i = 0; i
len2)149 // return 1;150 // if (len1 < len2)151 // return -1;152 // return strcmp(a, b);153 //}154 //void BigNumDividBig(char *a, char *arr, char *b, char *c)155 //{156 //157 // char temp[1005], time[1005];158 // int j, lentime, len, i, flag, k;159 // if (compare(b, c) == -1)160 // {161 // a[0] = '0';162 // a[1] = '\0';163 // strcpy(arr, b);164 // }165 // else if (compare(b, c) == 0)166 // {167 // a[0] = '1';168 // a[1] = '\0';169 // arr[0] = '0';170 // arr[1] = '\0';171 // }172 // else173 // {174 // j = lentime = 0;175 // len = strlen(b);176 // memset(temp, 0, sizeof(temp));177 // memset(time, 0, sizeof(time));178 // for (i = 0; i < len; i++)179 // { //计算得到被除数的前几位,得到整型数组形式的商180 // //time的一个元素表示一次相除的商181 // temp[j++] = b[i];182 // flag = 0;183 // while (compare(temp, c) >= 0)184 // {185 // BigSubBig(temp, temp, c);186 // time[lentime]++;187 // flag = 1;//控制time的元素的位置188 // }189 // if (flag)//将商转换为字符190 // time[lentime] += '0';191 // else//当被除数前几位小于除数,商补 192 // time[lentime] = '0';193 //194 // if (!strcmp(temp, "0"))//若temp为'' 195 // j = 0;196 // else//继续在b的后面加值 197 // j = strlen(temp);198 // lentime++;199 // }200 // k = 0;201 // for (i = 0; i < lentime; i++)202 // if (time[i] != '0')203 // break;//找到time数组中第一个不为的位置204 // for (j = i; j < lentime; j++)205 // a[k++] = time[j];206 // if (i == lentime)207 // a[k++] = '0';208 // a[k] = '\0';209 // strcpy(arr, temp);210 // }211 //}212 //int main()213 //{214 // char a[1005], b[1005], out[1005], arr[1005];215 // while (scanf("%s%s", a, b) != EOF)216 // {217 // BigNumDividBig(out, arr, a, b);218 // printf("%s\n", arr);219 // }220 // return 0;221 //}
View Code

 

 高精度阶乘

1 #include
2 #include
3 char s[50000]; 4 int a_int[50000] = { 0 }, b_int[50000] = { 0 }; 5 void BigNumMultiSmall(char *a, char *b, int mul) 6 { 7 //a表示结果,b表示被乘数,mul表示乘数 8 int i, j, len; 9 memset(a_int, 0, sizeof(a_int));10 memset(b_int, 0, sizeof(b_int));11 len = strlen(b);12 for (i = 0; i < len; i++)13 b_int[i] = b[len - 1 - i] - '0';14 for (i = 0; i
9)18 {19 a_int[i + 1] = a_int[i] / 10;20 a_int[i] = a_int[i] % 10;21 }22 }23 while (a_int[i])24 {25 a_int[i + 1] = a_int[i] / 10;26 a_int[i] = a_int[i] % 10;27 i++;28 }29 while (a_int[i - 1] == 0)30 i--;31 for (j = 0; j < i; j++)32 a[j] = a_int[i - j - 1] + '0';33 a[j] = '\0';34 }35 int main()36 {37 int n, i;38 while (scanf("%d", &n) != EOF)39 {40 s[0] = '1';41 s[1] = '\0';42 for (i = 1; i <= n; i++)43 BigNumMultiSmall(s, s, i);44 int len = strlen(s);45 printf("%s\n", s);46 }47 return 0;48 }
View Code

 

 

高精度小数乘方

1 #include
2 #include
3 char out[20000]; 4 void BigMultiBig(char *a, char *b, char *c) 5 { 6 int i, j, len1, len2, len; 7 int a_int[20010] = { 0 }, b_int[10000] = { 0 }, c_int[10000] = { 0 }; 8 9 len1 = strlen(b); 10 for (i = len1 - 1; i >= 0; i--) 11 b_int[len1 - i - 1] = b[i] - '0'; 12 len2 = strlen(c); 13 for (i = len2 - 1; i >= 0; i--) 14 c_int[len2 - i - 1] = c[i] - '0'; 15 16 len = len1 + len2; 17 18 for (i = 0; i < len1; i++) 19 for (j = 0; j < len2; j++) 20 a_int[i + j] += b_int[i] * c_int[j]; 21 for (i = 0; i
9) 23 { 24 a_int[i + 1] += a_int[i] / 10; 25 a_int[i] = a_int[i] % 10; 26 } 27 while (a_int[len - 1] == 0) 28 len--; 29 30 for (i = 0; i < len; i++) 31 a[i] = a_int[len - i - 1] + '0'; 32 a[i] = '\0'; 33 if (strlen(a) == 0) 34 strcpy(a, "0"); 35 } 36 int judge0(int a) 37 { 38 int i; 39 int len = strlen(out); 40 for (i = a; i < len; i++) 41 if (out[i] != '0') 42 return 1; 43 return 0; 44 } 45 int main() 46 { 47 char ch[1000]; 48 int n, i, point, j; 49 while (scanf("%s%d", ch, &n) != EOF) 50 { 51 strcpy(out, "1"); 52 int len = strlen(ch); 53 point = 0; 54 for (i = 0; i < len; i++) 55 if (ch[i] == '.') 56 { 57 point = (len - i - 1)*n; 58 for (j = i + 1; j <= len; j++) 59 ch[j - 1] = ch[j]; 60 } 61 for (i = 0; i
point) 71 { 72 for (i = 0; i < l; i++) 73 { 74 if (judge0(i) == 0 && i >= (l - point)) 75 { 76 if (out[i] != '0') 77 printf("%c", out[i]); 78 break; 79 } 80 if (i == l - point) 81 printf("."); 82 printf("%c", out[i]); 83 } 84 printf("\n"); 85 } 86 else 87 { 88 int flag = 1; 89 for (i = 0; i < point - l + 1; i++) 90 { 91 if (flag) 92 { 93 flag = 0; 94 printf("."); 95 } 96 else printf("0"); 97 } 98 for (i = 0; i < l; i++) 99 {100 if (judge0(i) == 0)101 break;102 printf("%c", out[i]);103 }104 printf("\n");105 }106 }107 return 0;108 }
View Code

 

高精度小数加法

1 #include
2 #include
3 void BigAddBig(char *a, char *b, char *c) 4 { 5 //a表示结果,b,c位加数 6 int a_int[1005] = { 0 }, b_int[1005] = { 0 }, c_int[1005] = { 0 }; 7 int len1, len2, len, i; 8 len1 = strlen(b); 9 len2 = strlen(c); 10 for (i = 0; i < len1; i++) 11 b_int[i] = b[len1 - 1 - i] - '0'; 12 for (i = 0; i
len2 ? len1 : len2; 15 for (i = 0; i
9) 19 { 20 a_int[i + 1] = a_int[i] / 10; 21 a_int[i] = a_int[i] % 10; 22 } 23 } 24 if (a_int[i] != 0) 25 len++; 26 while (!a_int[len - 1]) 27 len--; 28 for (i = 0; i < len; i++) 29 a[i] = a_int[len - 1 - i] + '0'; 30 a[i] = '\0'; 31 } 32 int faddf(char *a, char *b, char *c) 33 { 34 int len1, len2, len, i; 35 int flag = 0; 36 int a_int[500] = { 0 }, b_int[500] = { 0 }, c_int[500] = { 0 }; 37 len1 = strlen(b); 38 len2 = strlen(c); 39 len = len1 > len2 ? len1 : len2; 40 for (i = 0; i
0; i--) 45 { 46 a_int[i] += b_int[i] + c_int[i]; 47 if (a_int[i]>9) 48 { 49 a_int[i - 1]++; 50 a_int[i] = a_int[i] % 10; 51 } 52 } 53 a_int[0] += b_int[0] + c_int[0]; 54 if (a_int[0] > 9) 55 { 56 a_int[0] = a_int[0] % 10; 57 flag = 1; 58 } 59 60 while (1) 61 { 62 if (a_int[len - 1] == 0) 63 len--; 64 else break; 65 } 66 for (i = 0; i < len; i++) 67 a[i] = a_int[i] + '0'; 68 a[i] = '\0'; 69 return flag; 70 } 71 int judge(char *a) 72 { 73 int len = strlen(a); 74 for (int i = 0; i < len; i++) 75 if (a[i] != '0') 76 return 0; 77 return 1; 78 } 79 int main() 80 { 81 char ch1[500], ch2[500], out_int[500]; 82 char inter1[500], inter2[500], float1[500], float2[500], float0[500]; 83 int i; 84 while (scanf("%s%s", ch1, ch2) != EOF) 85 { 86 int len1 = strlen(ch1); 87 int len2 = strlen(ch2); 88 int c = 0; 89 for (i = 0; i < len1; i++) 90 { 91 if (ch1[i] == '.') 92 break; 93 inter1[c++] = ch1[i]; 94 } 95 inter1[c] = '\0'; 96 c = 0; 97 for (i = i + 1; i < len1; i++) 98 { 99 float1[c++] = ch1[i];100 }101 float1[c] = '\0';102 c = 0;103 for (i = 0; i < len2; i++)104 {105 if (ch2[i] == '.')106 break;107 inter2[c++] = ch2[i];108 }109 inter2[c] = '\0';110 c = 0;111 for (i = i + 1; i < len2; i++)112 {113 float2[c++] = ch2[i];114 }115 float2[c] = '\0';116 BigAddBig(out_int, inter1, inter2);117 int flag = faddf(float0, float1, float2);118 if (flag)119 {120 char one[2] = "1";121 BigAddBig(out_int, out_int, one);122 }123 int len = strlen(out_int);124 if (len == 0)125 strcpy(out_int, "0");126 if (judge(float0))127 printf("%s\n", out_int);128 else printf("%s.%s\n", out_int, float0);129 }130 }
View Code

 

转载于:https://www.cnblogs.com/zyxStar/p/4580305.html

你可能感兴趣的文章