高精度加法+减法

今天讲的是高精度加法减法。整理一下这部分,当模版了。。

高精度加法,无小数部分。

百炼 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 }

高精度加法带小数点那种

HDU 1753

  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 }

 

 

posted @ 2012-07-25 10:49  Naix_x  阅读(673)  评论(3编辑  收藏  举报