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;
    }
  • 相关阅读:
    OLAP ODS项目的总结 平台选型,架构确定
    ORACLE ORA12520
    ORACLE管道函数
    ORACLE RAC JDBC 配置
    ORACLE RAC OCFS连接产生的错误
    ORACLE 启动和关闭详解
    OLAP ODS项目的总结 起步阶段
    ORACLE RAC 配置更改IP
    ORACLE RAC OCR cann't Access
    ORACLE RAC Debug 之路 CRS0184错误与CRS初始化
  • 原文地址:https://www.cnblogs.com/dolphin0520/p/2012867.html
Copyright © 2011-2022 走看看