高精度加减乘除法

百练2981  http://poj.grids.cn/practice/2981/

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 int num[301];

 4 int main()

 5 {

 6     int i,j,f = 0,f1;

 7     char c1[201],c2[201];

 8     gets(c1);

 9     gets(c2);

10     i = strlen(c1)-1;

11     j = strlen(c2)-1;

12     int g = 0;

13     while(i>=0&&j>=0)

14     {

15         g++;    

16         if(c1[i]-'0'+c2[j]-'0'+num[g]>9)

17         {        

18             num[g+1] += (c1[i]-'0'+c2[j]-'0'+num[g])/10;

19             num[g] = (c1[i]-'0'+c2[j]-'0'+num[g])%10;

20             f1 = 0;

21         }

22         else

23             num[g] += c1[i]-'0'+c2[j]-'0';

24         i--;j--;

25     }    

26     while(i>=0)

27     {

28         g++;

29         if(num[g]+c1[i]-'0'>9)

30         {

31             num[g+1] += (num[g]+c1[i]-'0')/10;

32             num[g] = (num[g]+c1[i]-'0')%10;

33         }

34         else

35             num[g] += c1[i]-'0';

36         i--;

37     }

38     while(j>=0)

39     {

40         g++;

41         if(num[g]+c1[j]-'0'>9)

42         {

43             num[g+1] += (num[g]+c1[j]-'0')/10;

44             num[g] = (num[g]+c1[j]-'0')%10;

45         }

46         else

47             num[g] = num[g]+c1[j]-'0';

48         j--;

49     }

50     g++;

51     while(num[g]==0&&g)

52         g--;

53     for(i = g ; i>= 1; i--)

54     {

55         f = 1;

56         printf("%d",num[i]);

57     }

58     if(!f)

59         printf("0");

60         printf("\n");

61     return 0;

62 }

hdu 1002 http://acm.hdu.edu.cn/showproblem.php?pid=1002

加法 先字符串化整 直接相加 再进位

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 int main()

 4 {

 5     int i,j,k,t,a1[1001],a2[1001],g,f;

 6     char c1[1001],c2[1001];

 7     scanf("%d%*c",&t);

 8     for(j = 1; j <= t ; j++)

 9     {

10         scanf("%s %s",c1,c2);

11         memset(a1,0,sizeof(a1));

12         memset(a2,0,sizeof(a2));

13         f = 0;

14         for(i = 0 ; i < strlen(c1) ; i++)

15             a1[strlen(c1)-i-1] = c1[i]-'0';

16         for(i = 0 ; i < strlen(c2) ; i++)

17             a2[strlen(c2)-i-1] = c2[i]-'0';

18         if(strlen(c1)>strlen(c2))

19             k = strlen(c1);

20         else

21             k = strlen(c2);

22         for(i = 0 ; i < k ; i++)

23             a2[i] += a1[i];

24         for(i = 0 ; i < k ; i++)

25             if(a2[i]>9)

26             {

27                 a2[i+1] += a2[i]/10;

28                 a2[i] = a2[i]%10;

29             }

30         printf("Case %d:\n",j);

31         printf("%s + %s = ",c1,c2);

32         while(a2[i]==0&&i>=0)

33             i--;

34         for(g = i ; g >= 0 ; g--)

35         {

36             f = 1;

37             printf("%d",a2[g]);

38         }

39         if(!f)

40             printf("0");

41         printf("\n");

42         if(j!=t)

43             printf("\n");

44     }

45     return 0;

46 }

hdu1047 http://acm.hdu.edu.cn/showproblem.php?pid=1047

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 int main()

 4 {

 5     int i,j,t,num[101][201],toal[201],g;

 6     char c[101][101];

 7     scanf("%d%*c", &t);

 8     while(t--)

 9     {

10         memset(num,0,sizeof(num));

11         memset(toal,0,sizeof(toal));

12         i = 0;

13         int f = 0;

14         while(gets(c[i])!=NULL)

15         {

16             if(strcmp(c[i],"0")==0)

17                 break;

18             i++;

19         }

20         int max = 0;

21         for(j = 0 ; j < i ; j++)

22         {

23             for(g = 0 ; g < strlen(c[j]) ; g++)

24                 num[j][strlen(c[j])-g-1] = c[j][g]-'0';

25             if(strlen(c[j])>max)

26                 max = strlen(c[j]);        

27         }        

28         for(g = 0 ; g < max ; g++)

29             for(j = 0 ; j < i ; j++)

30             toal[g]+=num[j][g];

31         for(g = 0 ; g < max+3 ; g++)

32             if(toal[g]>9)

33             {

34                 toal[g+1] += toal[g]/10;

35                 toal[g] = toal[g]%10;

36             }

37         while(toal[g]==0&&g>=0)

38             g--;

39         for(i = g ; i>=0 ; i--)

40         {

41             f = 1;

42             printf("%d",toal[i]);

43         }

44         if(!f)

45             printf("0");

46         printf("\n");

47         if(t!=0)

48             puts("");

49     }

50     return 0;

51 }

hdu 1753 http://acm.hdu.edu.cn/showproblem.php?pid=1753

小数的加法 化为整数的加法 注意小数位不一样时 少的补0 前导0和小数后面多余的0要去掉

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 int main()

 4 {

 5     int i,j,k,t,a1[1001],a2[1001],g,f,k1,k2,x,y,w;

 6     char c1[1001],c2[1001];

 7     while(scanf("%s %s",c1,c2)!=EOF)

 8     {

 9         memset(a1,0,sizeof(a1));

10         memset(a2,0,sizeof(a2));

11         k1 = strlen(c1);

12         k2 = strlen(c2);

13         w =0;f = 0;x=y=0;

14         for(i = 0 ; i < k1 ; i++)

15         if(c1[i]=='.')

16         {

17             w = 1;

18             x = k1-1-i;

19             for(j = i ; j < k1-1 ; j++)

20             c1[j] = c1[j+1];

21             break;

22         }

23         if(w)

24         k1--;

25         w = 0;

26         for(i = 0 ; i < k2 ; i++)

27         if(c2[i]=='.')

28         {

29             w = 1;

30             y = k2-1-i;

31             for(j = i ; j < k2-1 ; j++)

32             c2[j] = c2[j+1];

33             break;

34         }

35         if(w)

36         k2--;

37         int g1=0,g2=0;

38         if(x<y)

39            {

40                for(i = 0 ; i < y-x ; i++)

41                a1[g1++] = 0;

42                x = y;

43            }

44         else

45            for(i = 0 ; i < x-y ; i++)

46            a2[g2++] = 0;

47         for(i = k1-1 ; i >= 0 ; i--)

48         a1[g1++] = c1[i]-'0';

49         for(i = k2-1 ; i >= 0 ; i--)

50         a2[g2++] = c2[i]-'0';

51         if(g1>g2)

52         g2 = g1;

53         for(i = 0 ; i < g2 ; i++)

54             a2[i] += a1[i];

55         for(i = 0 ; i < g2 ; i++)

56             if(a2[i]>9)

57             {

58                 a2[i+1] += a2[i]/10;

59                 a2[i] = a2[i]%10;

60             }

61         while(a2[i]==0&&i>=0)

62             i--;

63         j = 0;

64         while(a2[j]==0&&j<x)

65         j++;

66         for(g = i ; g >= j ; g--)

67         {

68             f = 1;

69             if(g+1==x)

70             {

71                 if(g==i)

72                 printf("0");

73                 printf(".");

74             }

75             printf("%d",a2[g]);

76         }

77         if(!f)

78             printf("0");

79         printf("\n");

80     }

81     return 0;

82 }

 百练2736 http://poj.grids.cn/practice/2736/ 

减法  直接把第二个数都变成负数相加

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 int main()

 4 {

 5     int i,j,k,t,a1[1001],a2[1001],g,f;

 6     char c1[1001],c2[1001];

 7     scanf("%d%*c",&t);

 8     for(j = 1; j <= t ; j++)

 9     {

10         scanf("%s %s",c1,c2);

11         memset(a1,0,sizeof(a1));

12         memset(a2,0,sizeof(a2));

13         f = 0;

14         for(i = 0 ; i < strlen(c1) ; i++)

15             a1[strlen(c1)-i-1] = c1[i]-'0';

16         for(i = 0 ; i < strlen(c2) ; i++)

17             a2[strlen(c2)-i-1] = (c2[i]-'0')*-1;

18         if(strlen(c1)>strlen(c2))

19             k = strlen(c1);

20         else

21             k = strlen(c2);

22         for(i = 0 ; i < k ; i++)

23             a1[i] += a2[i];

24         for(i = 0 ; i < k ; i++)

25             if(a1[i]<0)

26             {

27                 a1[i+1]--;

28                 a1[i] = a1[i]+10;

29             }

30         while(a1[i]==0&&i>=0)

31             i--;

32         for(g = i ; g >= 0 ; g--)

33         {

34             f = 1;

35             printf("%d",a1[g]);

36         }

37         if(!f)

38             printf("0");

39         printf("\n");

40     }

41     return 0;

42 }

 http://poj.org/problem?id=1001

化为整数相乘 再算出小数点在哪里

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 int num[1001];

 4 int main()

 5 {

 6     int i,j,k,n,x,y,w,o,g,a;

 7     char c[15],c1[1001],c2[1001];

 8     while(scanf("%s %d", c,&n)!=EOF)

 9     {

10         memset(num,0,sizeof(num));

11         memset(c2,'0',sizeof(c2));

12         k = strlen(c);

13         x  = 0; 

14         int f = 0;

15         for(i  = 0 ; i < k  ;i++)

16             if(c[i] == '.')

17             {

18                 x = k-1-i;

19                 for(j = i ; j < k-1 ; j++)

20                     c[j] = c[j+1];

21                 k--;

22                 break;

23             }

24         c[k] = '\0';

25         o = 0;

26         x = n*x;

27         for(i = k-1 ; i >= 0 ; i--)

28         {

29             

30             if(n==1)

31                 c2[o++] = c[i];

32             else

33                 c1[o++] = c[i];

34         }

35         for(i = 1; i < n ; i++)

36         {

37             w = 0;

38             memset(c2,'0',sizeof(c2));

39             for(j = k-1 ; j>=0 ; j--)

40             {

41                 g = w;

42                 for(y = 0 ; y< o ; y++)

43                 {

44                     if(c2[g]-'0'+(c[j]-'0')*(c1[y]-'0')>9)

45                     {

46                         c2[g+1]+=(c2[g]-'0'+(c[j]-'0')*(c1[y]-'0'))/10;

47                         c2[g] = (c2[g]-'0'+(c[j]-'0')*(c1[y]-'0'))%10+'0';

48                     }

49                     else

50                         c2[g]+= (c[j]-'0')*(c1[y]-'0');                                                                                

51                     g++;                    

52                 }

53                 w++;

54             }

55             if(c2[g]=='0')

56                 o = g;

57             else

58                 o = g+1;        

59             for(a = 0 ; a < o ; a++)

60                 c1[a] = c2[a];

61         }        

62         o++;        

63         while(c2[o]=='0'&&o>=x)

64             o--;                

65         j = 0;

66         while(c2[j]=='0'&&j<x)

67             j++;

68         for(i = o ; i >= j ; i--)

69         {

70             f = 1;

71             if(i+1==x)

72                 printf(".");

73             printf("%c",c2[i]);

74         }

75         if(!f)

76             printf("0");

77         printf("\n");

78     }

79     return 0;

80 }

 

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