比赛 防止浮躁的小练习v0.4 评测结果 C
题目名称 增强的减法问题 最终得分 0
用户昵称 S_L 运行时间 0.000 s
代码语言 C 内存使用 0.00 MiB
提交时间 2016-10-13 21:05:54
显示代码纯文本
#include "stdio.h"  
#include "string.h"  
  
/************************************************************************/  
/* 高精度减法    (这个函数要a[]>=b[])                                   */  
/* a[]被减数数组,位数不限                                              */  
/* b[]减数数组,位数不限                                                */  
/* back[]结果数组,位数不会大于a[]数组的                                */  
/************************************************************************/  
void sub(char a[],char b[],char back[])  
{  
    int i,k,l1,l2;  
    l1=strlen(a);  
    l2=strlen(b);  
    back[l1]='/0';  
    for (i=l2-1,l1--;i>=0;l1--,i--)                //减数的个数小于等于被减数,所以减的次数依减数而定  
    {  
        if (a[l1]-b[i]>=0)                         //不需要借位相减  
        {  
            back[l1]=a[l1]-b[i]+'0';  
        }  
        else                                       //向前一位借1  
        {  
            back[l1]=10+a[l1]-b[i]+'0';  
            if (a[l1-1]!='0')                      //当前一位非0,可以被借时,直接借来  
            {  
                a[l1-1]-=1;  
            }  
            else                                   //若前一位为0,则无法借到,继续向前一位的前一位借,循环  
            {  
                k=l1-1;  
                while (a[k]=='0')  
                {  
                    a[k]='9';                      //前一位的0,就变成了10,扣去被后一位借去的,还有9  
                    k--;  
                }  
                a[k]-=1;                           //到达可以借的位置  
            }  
        }  
    }  
    while (l1>=0)                                  //被减数多于减数的位数直接赋给结果数组  
    {  
        back[l1]=a[l1];  
        l1--;  
    }  
    while (back[0]=='0')                           //将结果数组往前移,方便以后的操作  
    {  
        l1=strlen(a);  
        for (i=0;i<l1-1;i++)  
        {  
            back[i]=back[i+1];  
        }  
        back[l1-1]='/0';  
    }  
    if (strlen(back)==0)                            //被减数与减数刚好相减为0的情况  
    {  
        back[0]='0';  
        back[1]='/0';  
    }  
}  
  
/************************************************************************/  
/* 判断函数(被减数与减数的大小比较)                                   */  
/* 可以用strcmp函数比较字符串                                           */  
/* 比较完后,若小于减数,则置换带入高精度减法函数,最后加'-'输出        */  
/************************************************************************/  
bool isBigger(char a[],char b[])  
{  
    int l1,l2;  
    l1=strlen(a);  
    l2=strlen(b);  
    if (l1>l2)  
    {  
        return true;  
    }  
    else if (l1<l2)  
    {  
        return false;  
    }  
    else  
    {  
        if (strcmp(a,b)>=0)  
        {  
            return true;  
        }  
        else  
        {  
            return false;  
        }  
    }  
}  
  
/************************************************************************/  
/* 主函数调用                                                           */  
/************************************************************************/  
int main()  
{  
    int n;  
    char a[1000],b[1000],c[1000];  
    printf("%s","计算次数: ");  
    scanf("%d",&n);  
    while (n--)  
    {  
        memset(a,'/0',sizeof(a));  
        memset(b,'/0',sizeof(b));  
        memset(c,'/0',sizeof(c));  
        printf("%s","被减数:  ");  
        scanf("%s",&a);  
        printf("%s","减数:    ");  
        scanf("%s",&b);  
        if (isBigger(a,b))  
        {  
            sub(a,b,c);  
            printf("%s%s/n/n","结果为:  ",c);  
        }  
        else  
        {  
            sub(b,a,c);  
            printf("%s%c%s/n/n","结果为:  ",'-',c);  
        }         
    }  
    return 0;  
}