C语言实现大数的减法

关于大数减法其核心就是:减法的算法也是从低位开始减,先要判断减数和被减数那一个位数长,减数位数长是正常减;被减数位数长,则被减数减减数,最后还要加上负号;
两个位数长度相等时,最好比较哪一个数大,否则负号会处理的很繁琐;处理每一项时,要先按对应的位用被减数减去减数,用数组存入,如果差小0,需要向上一位借位,再
把这一位的差加10,以此类推
#include<stdio.h>  
    #include<string.h>  
    #define M 100005 
    using namespace std;  
    char s1[M],s2[M],s[M];  
    int  a[M],b[M],c[M];  
    /*较大数减去较小数,即正常减*/  
    void ss(char s1[],char s2[],int n,int m)  
    {  
        int i,j,a[M],b[M];  
        for(i=0; i<n; i++)  
            a[i]=s1[n-i-1]-'0';  
        for(i=0; i<m; i++)  
            b[i]=s2[m-i-1]-'0';  
        for(i=0; i<n; i++)  
            c[i]=a[i]-b[i];  
        for(i=0;i<n;i++)  
          if(c[i]<0)  
            {  
                while(c[i]<0)  
                {  
                  c[i+1]=c[i+1]-1;//借位(高位减一,低位加十)  
                  c[i]+=10;  
                }  
            }  
    }  
    int main()  
    {  
        int n,m,i,j,k,kk;  
        memset(s1,0,sizeof(s1));  
        memset(s2,0,sizeof(s2));  
        while(~scanf("%s%s",s1,s2))  
        {  
            n=strlen(s1);  
            m=strlen(s2);  
            printf("s1=%d s2=%d\n",n,m);  
            if(n>m)  
                ss(s1,s2,n,m);  
            else if(n<m)  
            {  
                printf("-");  
                ss(s2,s1,m,n);  
            }  
            else  
            {  /*当两个数位数相同时,判断两个数的大小 */  
                k=strcmp(s1,s2);  
    /*strcmp()函数:从第一位开始比较两个字符串大小(不管位数多少)  
    k>0则s1较大,k<0则s2较大,k=0则s1=s2*/    
                if(k==0)  
                {  
                    printf("0\n");  
                    continue;  
                }  
                else if(k>0)  
                    ss(s1,s2,n,m);  
                else  
                {  
                    printf("-");  
                    ss(s2,s1,m,n);  
                }  
            }  
            if(n>m) kk=n;  
            else kk=m;  
            while(c[kk]==0) kk--;//排除前导0  
            for(i=kk; i>=0; i--)  
                printf("%d",c[i]);  
            printf("\n");  
        }  
        return 0;  
    }  

猜你喜欢

转载自blog.csdn.net/dk1543100966/article/details/72793951