今天讲的是高精度加法减法。整理一下这部分,当模版了。。
高精度加法,无小数部分。
百炼 2981大整数加法
算是精简了一点。
1 #include <stdio.h> 2 #include <string.h> 3 int p1[300],p2[300]; 4 int main() 5 { 6 char str1[201],str2[201]; 7 int i,len1,len2,max; 8 scanf("%s%s",str1,str2); 9 len1 = strlen(str1); 10 len2 = strlen(str2); 11 for(i = 0;i <= len1-1;i ++) 12 p1[len1-i-1] = str1[i] - '0'; 13 for(i = 0;i <= len2-1;i ++) 14 p2[len2-i-1] = str2[i] - '0'; 15 if(len1 > len2) 16 max = len1-1; 17 else 18 max = len2-1; 19 for(i = 0;i <= max;i ++) 20 { 21 p1[i] += p2[i]; 22 } 23 for(i = 0;i <= max;i ++) 24 { 25 if(p1[i] > 9) 26 { 27 p1[i+1] += p1[i]/10; 28 p1[i] = p1[i]%10; 29 if(i+1 > max) 30 max = i+1; 31 } 32 } 33 for(i = max;i >=0;i --) 34 { 35 printf("%d",p1[i]); 36 } 37 printf("\n"); 38 return 0; 39 }
百炼 2736 大整数减法(简单a > b那种)
1 #include <stdio.h> 2 #include <string.h> 3 int p1[300],p2[300]; 4 int main() 5 { 6 char str1[201],str2[201]; 7 int i,len1,len2,max,t; 8 scanf("%d%*c",&t); 9 while(t--) 10 { 11 memset(p1,0,sizeof(p1)); 12 memset(p2,0,sizeof(p2)); 13 scanf("%s%s",str1,str2); 14 len1 = strlen(str1); 15 len2 = strlen(str2); 16 for(i = 0; i <= len1-1; i ++) 17 p1[len1-i-1] = str1[i] - '0'; 18 for(i = 0; i <= len2-1; i ++) 19 p2[len2-i-1] = str2[i] - '0'; 20 if(len1 > len2) 21 max = len1-1; 22 else 23 max = len2-1; 24 for(i = 0; i <= max; i ++) 25 { 26 p1[i] -= p2[i]; 27 } 28 for(i = 0; i <= max; i ++) 29 { 30 if(p1[i] < 0) 31 { 32 while(p1[i] < 0) 33 { 34 p1[i+1] --; 35 p1[i] = p1[i]+10; 36 } 37 if(i+1 == max&&p1[i+1] == 0) 38 max = i-1; 39 } 40 } 41 for(i = max; i >=0; i --) 42 { 43 printf("%d",p1[i]); 44 } 45 printf("\n"); 46 } 47 return 0; 48 }
高精度加法带小数点那种
1 #include <stdio.h> 2 #include <string.h> 3 int p1[500],p2[500],o1[501],o2[501]; 4 int main() 5 { 6 char str1[501],str2[501]; 7 int i,j,k,len1,len2,max,z,point1,point2; 8 while(scanf("%s%s",str1,str2)!=EOF) 9 { 10 memset(p1,0,sizeof(p1)); 11 memset(p2,0,sizeof(p2)); 12 memset(o1,0,sizeof(o1)); 13 memset(o2,0,sizeof(o2)); 14 len1 = strlen(str1); 15 len2 = strlen(str2); 16 point1 = len1; 17 point2 = len2;//初始化一定要写 18 for(i = 0; i <= len1; i ++)//找是否有小数点 19 { 20 if(str1[i] == '.') 21 { 22 point1 = i; 23 } 24 } 25 for(i = 0; i <= len2; i ++) 26 { 27 if(str2[i] == '.') 28 { 29 point2 = i; 30 } 31 } 32 for(i = point1-1; i >= 0; i --)//转化字符串 33 { 34 p1[point1-i-1] = str1[i]-'0'; 35 } 36 for(i = point2-1; i >= 0; i --) 37 { 38 p2[point2-i-1] = str2[i]-'0'; 39 } 40 if(len1-point1 > len2-point2)//这个小数部分写的比较麻烦max是存在小数的最长长度 41 max = len1-point1-1; 42 else 43 max = len2-point2-1; 44 j = k = 0;//写这一部分挺纠结的。。写两个小数模拟一下,就可以写出来了,这应该是最麻烦的部分了。 45 for(i = 0; i <= max-1; i ++) 46 { 47 if(i >= max - (len1-point1-1))//让最长的小数部分和小数部分长度比较 48 { 49 o1[i] = str1[len1-1-k] - '0'; 50 k ++; 51 } 52 if(i >= max - (len2-point2-1)) 53 { 54 o2[i] = str2[len2-1-j] - '0'; 55 j ++; 56 } 57 } 58 for(i = 0;i <= max-1;i ++)//加 59 { 60 o1[i] += o2[i]; 61 } 62 for(i = 0;i <= max-1;i ++)//进位 63 { 64 if(o1[i] > 9) 65 { 66 if(i+1 == max)//注意特判 67 p1[0] += o1[i]/10; 68 else 69 o1[i+1] += o1[i]/10; 70 o1[i] = o1[i] % 10; 71 } 72 } 73 for(i = 0;i <= 450;i ++)//加法,为了方便直接到450位了。。 74 { 75 p1[i] += p2[i]; 76 } 77 for(i = 0;i <= 450;i ++)//进位 78 { 79 if(p1[i] > 9) 80 { 81 p1[i+1] += p1[i]/10; 82 p1[i] = p1[i]%10; 83 } 84 } 85 z = 0; 86 for(i = 450;i >=0;i --)//判断 87 { 88 if(p1[i] != 0) 89 z = 1; 90 if(z) 91 printf("%d",p1[i]); 92 } 93 if(!z)//特判 94 printf("0"); 95 z = 0; 96 for(i = 0;i <= max-1;i ++) 97 { 98 if(o1[i] != 0)//清除后导0 99 { 100 z = 1; 101 j = i; 102 break; 103 } 104 } 105 if(z)//输出小数部分 106 { 107 printf("."); 108 for(i = max-1;i >= j;i --) 109 { 110 printf("%d",o1[i]); 111 } 112 } 113 printf("\n"); 114 } 115 return 0; 116 }