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

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

    1.加法。

      如:

      Input: 123456789123456789123456789

                1

      Output:123456789123456789123456790

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

    #include<stdio.h>
    #include<string.h>
    int max(int x,int y)
    {
        if(x>y)
            return x;
        else
            return y;
    }
    
    int main(void)
    {
        
        char str1[510],str2[510];
        while(scanf("%s %s",str1,str2)==2)
        {
            
            int a[510]={0},b[510]={0},c[510]={0},i;
            int m,n,max1=0;
            m=strlen(str1);
            n=strlen(str2);
            max1=max(m,n);
            for(i=0;i<max1;i++)
            {
                a[m-i-1]=str1[i]-48;
                b[n-i-1]=str2[i]-48;
            }
            for(i=0;i<max1;i++)
                c[i]=a[i]+b[i];
            for(i=0;i<max1;i++)
            { 
                c[i+1]=c[i]/10+c[i+1];
                c[i]=c[i]%10;
            }
            if(c[max1]!=0)
            {
                for(i=max1;i>=0;i--)
                    printf("%d",c[i]);
            }
            else
            {
                for(i=max1-1;i>=0;i--)
                    printf("%d",c[i]);
            }
            printf("\n");
        }
        return0;
    }

    2.减法

    Input:123456789123456789

             1

    Output:123456789123456788

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

    #include<stdio.h>
    
    #include<string.h>
    
    int main(void)
    {
        char s1[505],s2[505];
        while(scanf("%s%s",s1,s2)==2)
        {
            int i,j,len1,len2;
            int a[105]={0},b[105]={0};
            len1=strlen(s1);
            len2=strlen(s2);
            for(i=len1-1,j=0;i>=0;i--,j++)
            {
                a[j]=s1[i]-48;
            }
            for(i=len2-1,j=0;i>=0;i--,j++)
            {
                b[j]=s2[i]-48;
            }
            for(i=0;i<len1;i++)
            {
                a[i]=a[i]-b[i];
                if(a[i]<0)
                {
                    a[i]+=10;
                    a[i+1]--;
                }
            }
            i=len1-1;
            while(a[i]==0)
            {
                i--;
            }
            for(;i>=0;i--)
            {
                printf("%d",a[i]);
            }
            printf("\n");
        }
        return0;
    }

     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

    #include<iostream>
    #include<string.h>
    usingnamespace std;
    
    
    int main(void)
    {
        char s1[510],s2[510],temp[510];
        int a[510],b[510],c[1010];
        while(scanf("%s%s",s1,s2)==2)
        {
            int i,j,h;
            int len1,len2;
            if(strlen(s1)<strlen(s2))
            {
                strcpy(temp,s1);
                strcpy(s1,s2);
                strcpy(s2,temp);
            }
            len1=strlen(s1);
            len2=strlen(s2);
            memset(c,0,sizeof(c));
            for(i=len1-1,j=0;i>=0;i--,j++)
            {
                a[j]=s1[i]-48;
            }
            for(i=len2-1,j=0;i>=0;i--,j++)
            {
                b[j]=s2[i]-48;
            }
            for(i=0;i<len2;i++)
            {
                for(j=0;j<len1;j++)
                {
                    c[i+j]=a[j]*b[i]+c[i+j];
                }
            }
            for(i=0;i<2*len1;i++)
            {
                if(c[i]>=10)
                {
                    c[i+1]=c[i+1]+c[i]/10;
                    c[i]=c[i]%10;
                }
            }
            i=2*len1;
            while(c[i]==0)
            {
                i--;
            }
            if(i<0)
            {
                printf("0\n");
            }
            else
            {
                for(;i>=0;i--)
                    printf("%d",c[i]);
                printf("\n");
            }    
        }
        return0;
    }

    4.除法

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

    #include<stdio.h>
    #include<string.h>
    
    int len1,len2;
    char s1[905];
    char s2[905];
    int re[905];
    
    void sub()
    {
        int i=0;
        int j;
        while(1)
        {
            if(s1[i]=='0')
                i++;
            else
            {
                j=i;
                break;
            }
        }
        for(;i<len2;i++)
        {
            s1[i]=s1[i]-s2[i]+'0';
        }
        for(i=len2-1;i>j;i--)    //低位开始检测是否小于0
        {
            if(s1[i]<'0')
            {
                s1[i]+=10;
                s1[i-1]--;
            }
        }
    }
    
    int main(void)
    {
        int i,p;
        while(scanf("%s%s",s1,s2)==2)
        {
            len1=strlen(s1);
            len2=strlen(s2);
            if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0
            {
                printf("0\n");
                continue;
            }
            p=0;
            while(1)
            {
                re[p]=0;
                while(strncmp(s1,s2,len2)>=0)       //一直进行减法,直到不能减为止
                 {
                    sub();
                    re[p]++;
                }
                p++;
                if(len1==len2)
                    break;
                for(i=len2-1;i>=0;i--)             //在s2前面补0,以便进行减法运算
                 {
                    s2[i+1]=s2[i];
                }
                s2[0]='0';
                len2++;
                s2[len2]='\0';
            }
            i=0;
            while(1)
            {
                if(re[i]==0)
                    i++;
                else
                    break;
            }
            for(;i<p;i++)
                printf("%d",re[i]);
            printf("\n");
        }
        return0;
    }
  • 相关阅读:
    redis运维手册
    grafana展示ES中的nginx日志-地图展示
    nginx针对yum安装nginx重编译
    K8S-yaml里初始化容器
    K8S-资源配置清单补充1
    K8S-资源配置清单详解
    Docker cp 提示“no space left on device”
    磁盘
    ansible 对文件内容的操作
    ansible 初始化系统分区格式化
  • 原文地址:https://www.cnblogs.com/dolphin0520/p/2012867.html
Copyright © 2011-2022 走看看