高精度加法+减法

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

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

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

 

 

你可能感兴趣的:(精度)