高精度模板(含加减乘除四则运算)
高精度加高精度
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; i++) 11 c_int[i] = c[len2 - 1 - i] - '0'; 12 len = len1>len2 ? len1 : len2; 13 for (i = 0; i<len; i++) 14 { 15 a_int[i] += b_int[i] + c_int[i]; 16 if (a_int[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 }
高精度减高精度(未经过严格测试)
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; i++) 11 c_int[i] = c[len2 - 1 - i] - '0'; 12 len = len1>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 }
高精度乘以低精度
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<len; i++) 10 { 11 a_int[i] = a_int[i] + b_int[i] * mul; 12 if (a_int[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 }
高精度乘以高精度
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<len; i++) 19 if (a_int[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 }
高精度除以低精度
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 else 26 { 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 }
高精度除以高精度(未经过严格测试)
1 #include<stdio.h> 2 #include<string.h> 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; i++) 13 c_int[i] = c[len2 - 1 - i] - '0'; 14 len = len1>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<len; i++) 29 a[i] = a_int[len - 1 - i] + '0'; 30 a[i] = '\0'; 31 } 32 int compare(char *a, char *b) 33 { 34 int len1 = strlen(a); 35 int len2 = strlen(b); 36 if (len1>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<stdio.h> 114 //#include<string.h> 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; i++) 125 // c_int[i] = c[len2 - 1 - i] - '0'; 126 // len = len1>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<len; i++) 141 // a[i] = a_int[len - 1 - i] + '0'; 142 // a[i] = '\0'; 143 //} 144 //int compare(char *a, char *b) 145 //{ 146 // int len1 = strlen(a); 147 // int len2 = strlen(b); 148 // if (len1>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 // else 173 // { 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 //}
高精度阶乘
1 #include<stdio.h> 2 #include<string.h> 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<len; i++) 15 { 16 a_int[i] = a_int[i] + b_int[i] * mul; 17 if (a_int[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 }
高精度小数乘方
1 #include<stdio.h> 2 #include<string.h> 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<len; i++) 22 if (a_int[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<n; i++) 62 BigMultiBig(out, out, ch); 63 if (strcmp(out, "0") == 0) 64 { 65 printf("0\n"); 66 continue; 67 } 68 69 int l = strlen(out); 70 if (l>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 }
高精度小数加法
1 #include<stdio.h> 2 #include<string.h> 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; i++) 13 c_int[i] = c[len2 - 1 - i] - '0'; 14 len = len1>len2 ? len1 : len2; 15 for (i = 0; i<len; i++) 16 { 17 a_int[i] += b_int[i] + c_int[i]; 18 if (a_int[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<len1; i++) 41 b_int[i] = b[i] - '0'; 42 for (i = 0; i<len2; i++) 43 c_int[i] = c[i] - '0'; 44 for (i = len - 1; 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 }
如果这是你所爱的,就不要让自己后悔~~~