zoukankan      html  css  js  c++  java
  • 大数的四则运算(转)

     原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/04/11/2012867.html

    在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。

    1.加法。

      如:

      Input: 123456789123456789123456789

                1

      Output:123456789123456789123456790

      输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。

    View Code
     1 加法模板
     2 
     3 #include<stdio.h>
     4 #include<string.h>
     5 int max(int x,int y)
     6 {
     7     if(x>y)
     8         return x;
     9     else
    10         return y;
    11 }
    12 
    13 int main(void)
    14 {
    15     
    16     char str1[510],str2[510];
    17     while(scanf("%s %s",str1,str2)==2)
    18     {
    19         
    20         int a[510]={0},b[510]={0},c[510]={0},i;
    21         int m,n,max1=0;
    22         m=strlen(str1);
    23         n=strlen(str2);
    24         max1=max(m,n);
    25         for(i=0;i<max1;i++)
    26         {
    27             a[m-i-1]=str1[i]-48;
    28             b[n-i-1]=str2[i]-48;
    29         }
    30         for(i=0;i<max1;i++)
    31             c[i]=a[i]+b[i];
    32         for(i=0;i<max1;i++)
    33         { 
    34             c[i+1]=c[i]/10+c[i+1];
    35             c[i]=c[i]%10;
    36         }
    37         if(c[max1]!=0)
    38         {
    39             for(i=max1;i>=0;i--)
    40                 printf("%d",c[i]);
    41         }
    42         else
    43         {
    44             for(i=max1-1;i>=0;i--)
    45                 printf("%d",c[i]);
    46         }
    47         printf("\n");
    48     }
    49     return 0;
    50 }

     2.减法

    Input:123456789123456789

             1

    Output:123456789123456788

    原理同加法一样(这里假设第一个数大于第二个数

    View Code
     1 减法模板
     2 
     3 #include<stdio.h>
     4 
     5 #include<string.h>
     6 
     7 int main(void)
     8 {
     9     char s1[505],s2[505];
    10     while(scanf("%s%s",s1,s2)==2)
    11 
    12     {
    13         int i,j,len1,len2;
    14         int a[105]={0},b[105]={0};
    15         len1=strlen(s1);
    16         len2=strlen(s2);
    17         for(i=len1-1,j=0;i>=0;i--,j++)
    18         {
    19             a[j]=s1[i]-48;
    20         }
    21         for(i=len2-1,j=0;i>=0;i--,j++)
    22         {
    23             b[j]=s2[i]-48;
    24         }
    25         for(i=0;i<len1;i++)
    26         {
    27             a[i]=a[i]-b[i];
    28             if(a[i]<0)
    29             {
    30                 a[i]+=10;
    31                 a[i+1]--;
    32             }
    33         }
    34         i=len1-1;
    35         while(a[i]==0)
    36         {
    37             i--;
    38         }
    39         for(;i>=0;i--)
    40         {
    41             printf("%d",a[i]);
    42         }
    43         printf("\n");
    44     }
    45     return 0;
    46 }

    3.乘法

      原理上也是采用数组模拟。

     a[i]   12345

     b[j]        23

     用c[k]来保存每次的运算结果,k=i+j;

     c[i+j]=c[i+j]+a[i]*b[j];

     这里来模拟一次乘法过程:

                123

             *   12

          --------------

                 246   

            + 123

          --------------

                1476

    View Code
     1 乘法模板
     2 
     3 #include<iostream>
     4 #include<string.h>
     5 using namespace std;
     6 
     7 
     8 int main(void)
     9 {
    10     char s1[510],s2[510],temp[510];
    11     int a[510],b[510],c[1010];
    12     while(scanf("%s%s",s1,s2)==2)
    13     {
    14         int i,j,h;
    15         int len1,len2;
    16         if(strlen(s1)<strlen(s2))
    17         {
    18             strcpy(temp,s1);
    19             strcpy(s1,s2);
    20             strcpy(s2,temp);
    21         }
    22         len1=strlen(s1);
    23         len2=strlen(s2);
    24         memset(c,0,sizeof(c));
    25         for(i=len1-1,j=0;i>=0;i--,j++)
    26         {
    27             a[j]=s1[i]-48;
    28         }
    29         for(i=len2-1,j=0;i>=0;i--,j++)
    30         {
    31             b[j]=s2[i]-48;
    32         }
    33         for(i=0;i<len2;i++)
    34         {
    35             for(j=0;j<len1;j++)
    36             {
    37                 c[i+j]=a[j]*b[i]+c[i+j];
    38             }
    39         }
    40         for(i=0;i<2*len1;i++)
    41         {
    42             if(c[i]>=10)
    43             {
    44                 c[i+1]=c[i+1]+c[i]/10;
    45                 c[i]=c[i]%10;
    46             }
    47         }
    48         i=2*len1;
    49         while(c[i]==0)
    50         {
    51             i--;
    52         }
    53         if(i<0)
    54         {
    55             printf("0\n");
    56         }
    57         else
    58         {
    59             for(;i>=0;i--)
    60                 printf("%d",c[i]);
    61             printf("\n");
    62         }    
    63     }
    64     return 0;
    65 }

    4.除法

    除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。

    View Code
     1 除法模板
     2 
     3 #include<stdio.h>
     4 #include<string.h>
     5 
     6 int len1,len2;
     7 char s1[905];
     8 char s2[905];
     9 int re[905];
    10 
    11 void sub()
    12 {
    13     int i=0;
    14     int j;
    15     while(1)
    16     {
    17         if(s1[i]=='0')
    18             i++;
    19         else
    20         {
    21             j=i;
    22             break;
    23         }
    24     }
    25     for(;i<len2;i++)
    26     {
    27         s1[i]=s1[i]-s2[i]+'0';
    28     }
    29     for(i=len2-1;i>j;i--)    //低位开始检测是否小于0
    30     {
    31         if(s1[i]<'0')
    32         {
    33             s1[i]+=10;
    34             s1[i-1]--;
    35         }
    36     }
    37 }
    38 
    39 int main(void)
    40 {
    41     int i,p;
    42     while(scanf("%s%s",s1,s2)==2)
    43     {
    44         len1=strlen(s1);
    45         len2=strlen(s2);
    46         if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0
    47         {
    48             printf("0\n");
    49             continue;
    50         }
    51         p=0;
    52         while(1)
    53         {
    54             re[p]=0;
    55             while(strncmp(s1,s2,len2)>=0)       //一直进行减法,直到不能减为止
    56              {
    57                 sub();
    58                 re[p]++;
    59             }
    60             p++;
    61             if(len1==len2)
    62                 break;
    63             for(i=len2-1;i>=0;i--)             //在s2前面补0,以便进行减法运算
    64              {
    65                 s2[i+1]=s2[i];
    66             }
    67             s2[0]='0';
    68             len2++;
    69             s2[len2]='\0';
    70         }
    71         i=0;
    72         while(1)
    73         {
    74             if(re[i]==0)
    75                 i++;
    76             else
    77                 break;
    78         }
    79         for(;i<p;i++)
    80             printf("%d",re[i]);
    81         printf("\n");
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    修改centos7 DNS
    group by
    Oracle 删除表空间
    Oralce查看sid 、service_name
    Mysql修改lower_case_table_names
    Oralce静默安装
    Linux安装Mysql
    dbvisualier破解及使用
    Oracle扩容表空间
    lvm方式挂载盘及扩容
  • 原文地址:https://www.cnblogs.com/kane0526/p/2978472.html
Copyright © 2011-2022 走看看