高精度加法:
P1601 A+B Problem(高精)
1 #include<stdio.h> 2 #include<string.h> 3 int a[510], b[510], k; 4 int cmd() 5 { 6 if (a[0] == b[0])return 0; 7 else if (a[0] > b[0])return 1; 8 else return -1; 9 } 10 void sum()//高精度加法 11 { 12 int flag = cmd(); 13 int i; 14 if (flag == 0||flag==1)k = a[0]; 15 else if (flag == -1)k = b[0]; 16 for (i = 1; i <= k; i++) 17 { 18 a[i + 1] += (a[i] + b[i]) / 10; 19 a[i] = (a[i] + b[i]) % 10; 20 } 21 while (a[k] >= 10) 22 { 23 a[k + 1] += a[k]/10; 24 a[k] = a[k]%10; 25 k++; 26 } 27 while (a[k + 1] > 0)k++; 28 } 29 int main() 30 { 31 char arr[510]; 32 int i, j; 33 for (i = 1; i <= 2; i++) 34 { 35 scanf("%s", arr+1); 36 if (i == 1) 37 { 38 a[0] = strlen(arr+1); 39 for (j = 1; j <= a[0]; j++) 40 a[a[0] - j+1] = arr[j]-'0'; 41 } 42 else 43 { 44 b[0] = strlen(arr+1); 45 for (j = 1; j <= b[0]; j++) 46 b[b[0] - j+1] = arr[j]-'0'; 47 } 48 } 49 sum(); 50 for (i = k; i >= 1; i--) 51 printf("%d", a[i]); 52 return 0; 53 }
0位存储位数,低位开始存低位,例如256 那么arr[0]=3; arr[ 1 ] = 6; arr[ 2 ] = 5; arr[ 3]=2
相加的时候从低位开始加,先进位,在取模
a[i + 1] += (a[i] + b[i]) / 10;//进位
a[i] = (a[i] + b[i]) % 10;//当前位
输出的时候从高位开始输出
最后要确保0位的值是结果的位数
高精度减法:
p2142 高精度减法
1 #include<stdio.h> 2 #include<string.h> 3 int a[10010], b[10010], k; 4 int cmd() 5 { 6 if (a[0] == b[0]) 7 { 8 int i; 9 for (i = a[0]; i >= 1; i--) 10 { 11 if (a[i] > b[i]) return 1; 12 else if (a[i] < b[i])return -1; 13 } 14 } 15 else if (a[0] > b[0])return 1; 16 else if (a[0] < b[0])return -1; 17 return 0; 18 } 19 int stract()//高精度减法,1为正,-1为负 20 { 21 int flag = cmd(); 22 int i; 23 if (flag == 0) return 0; 24 if (flag == 1) 25 { 26 k = a[0]; 27 a[0] = 1; 28 for (i = 1; i <= k; i++) 29 { 30 if (a[i] < b[i]) 31 { 32 a[i + 1]--; 33 a[i] += 10; 34 } 35 a[i] -= b[i]; 36 } 37 while (a[k] == 0) 38 k--; 39 } 40 else if (flag == -1) 41 { 42 k = b[0]; 43 a[0] = -1; 44 for (i = 1; i <= k; i++) 45 { 46 if (a[i] > b[i]) 47 { 48 b[i + 1]--; 49 b[i] += 10; 50 } 51 a[i] = b[i] - a[i]; 52 } 53 while (b[k] == 0) 54 k--; 55 } 56 return 1; 57 } 58 int main() 59 { 60 char arr[10010]; 61 int i, j, flag; 62 for (i = 1; i <= 2; i++) 63 { 64 scanf("%s", arr+1); 65 if (i == 1) 66 { 67 a[0] = strlen(arr+1); 68 for (j = 1; j <= a[0]; j++) 69 a[a[0] - j+1] = arr[j]-'0'; 70 } 71 else 72 { 73 b[0] = strlen(arr+1); 74 for (j = 1; j <= b[0]; j++) 75 b[b[0] - j+1] = arr[j]-'0'; 76 } 77 } 78 flag=stract(); 79 if (!flag)printf("0"); 80 else 81 { 82 if (a[0] == 1) 83 { 84 for (i = k; i >= 1; i--) 85 printf("%d", a[i]); 86 } 87 else 88 { 89 printf("-"); 90 for (i = k; i >= 1; i--) 91 printf("%d", a[i]); 92 } 93 } 94 return 0; 95 }
首先cmd()判断两个值大小关系,保证用大的值减去小值,判断结果正负,在0位记录结果正负,1正 -1负
0位一开始是数值的位数,之后赋值给k,从低位开始减,不够减时就向高位借,高位为-1也是没关系的,会再向高位借
由于cmd()确保了大值减小的,所以最后必定够减,且每位都是0-9的正数
最后更新k值,k是结果的位数
高精度乘法:
1 #include<stdio.h> 2 #include<string.h> 3 int a[2010], b[2010], c[5010], k, ka, kb; 4 int multi()//高精度乘法(高精度*高精度)初始化为1;bug 5 { 6 int i, j; 7 k = ka+kb; 8 for (i = 0; i < ka; i++) 9 { 10 for (j = 0; j < kb; j++) 11 { 12 c[i + j] += a[i] * b[j]; 13 c[i + j+1 ] += c[i + j] / 10; 14 c[i + j] %= 10; 15 } 16 } 17 while (c[k]== 0)k--; 18 return 1; 19 } 20 int main() 21 { 22 char arr[10010]; 23 int i, j, flag; 24 for (i = 1; i <= 2; i++) 25 { 26 scanf("%s", arr); 27 if (i == 1) 28 { 29 ka = strlen(arr); 30 for (j = 0; j <= ka; j++) 31 a[ka-j-1] = arr[j]-'0'; 32 } 33 else 34 { 35 kb = strlen(arr); 36 for (j = 0; j <= kb; j++) 37 b[ kb-j-1] = arr[j]-'0'; 38 } 39 } 40 flag=multi(); 41 if (ka==1&&a[0]==0||kb==1&&b[0]==0)printf("0"); 42 else 43 { 44 for (i = k; i >= 0; i--) 45 printf("%d", c[i]); 46 } 47 return 0; 48 }
依然是0位存位数,从1开始存低位,因为n位的数乘m位的数,结果的位数一定有y>=(m+n)
第a位乘第b位 必然只会对(a+b)位和(a+b+1)位有影响,因为是0-9的乘法所以最大只会是81
所以不会对(a+b+2)及之后的位有影响
接下来只需从低位开始更新最高位即可
k=ka+kb
考虑会有进位的情况
所以最后还要更新k的值使其等于结果的位数
还有高精度*低精度的算法,这里还是只需考虑9*x,看其会影响多少位更新c的值
例如x=12 此时9*12=108>99所以还会影响到(a+b+2)位,需要考虑
当影响位数过多时建议化成将x化成高精度,转化成高精度*高精度
高精度除法(待填坑)
浙公网安备 33010602011771号