zoukankan      html  css  js  c++  java
  • 高精度加减乘除法

    百练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 }
  • 相关阅读:
    RabbitMQ教程
    设置文件夹共享及所有访问权限
    一键操作IIS
    C#操作IIS服务
    【01】浅谈HTTP在WebApi开发中的运用
    Socket通信原理
    C# 通过JObject解析json对象
    MVC小知识整理
    Global.asax文件的作用
    iOS开发日记9-终端命令
  • 原文地址:https://www.cnblogs.com/shangyu/p/2608565.html
Copyright © 2011-2022 走看看