0
点赞
收藏
分享

微信扫一扫

【C语言】高精度减法

boomwu 2022-05-11 阅读 72
#include<stdio.h>
#include<string.h>
#define N 100
int allDigit(char *s)
{
    while(*s)
    {
        if(!(*s>='0'&&*s<='9'))
            return 0;
        s++;
    }
    return 1;
}
void input(char s[],int p[]) 
{
    int len=strlen(s);
    int i;
    for(i=0;i<len;i++)
    {
        p[len-i]=s[i]-'0';
        p[0]=len;
    }
}
//判断a,b中存放的拆分数字的大小
//a大返回正值,b大返回负值,相等返回0
int cmp(int a[],int b[])
{//若a>b返回正数
//若a<b返回负数
//若a==b返回0
    int len1,len2;
    len1=a[0];
    len2=b[0];
    //计算除去前导0的数字长度,需考虑数字本身为0
    while(a[len1]==0&&len1>1)
        len1--;
        a[0]=len1;
    while(b[len2]==0&&len2>1)
        len2--;
        b[0]=len2;
    if(len1>len2)
        return 1;
    if(len1<len2)
        return -1;

    while(len1>0)
    {
//若数字等长,从最高位开始,逐次比较对应位
        if(a[len1]==b[len1])
            len1--;
        else
            return a[len1]-b[len1];
    }
    return 0;
 } 
int sub(int a[],int b[])
{
    int sign=1;//值为-1表示负数
    int i=cmp(a,b);

    //若a==b
    if(i==0)
    {
        a[1]=0;
        a[0]=1;
        return 0;
    }
    //a<b,则交换a,b的值,设置结果符合为负

    if(i<0)
    {
        int c[N]={0};
        memcpy(c , a , sizeof(int)*(b[0]+1));
        memcpy(a , b , sizeof(int)*(b[0]+1));
        memcpy(b , c , sizeof(int)*(b[0]+1));
        sign=-1;

    }
    //a>b,直接计算,不必交换
    for(i=1;i<=a[0];i++)
        a[i]=a[i]-b[i];
        if(a[i]<0)
        {

            a[i+1]--;
            a[i]=a[i]+10;

        }

//减法后可能出现前导0
for(i=a[0];i>1;i--)
    if(a[i]==0)
        a[0]--;
    else
        break;

    return sign; 
}
int main()
{
    char s[N];
    int a[N]={0},b[N]={0};
    int i,sign;
    printf("请输入数字串1:\n");
    do
    {
        gets(s);
        if(allDigit(s))
            break;
    }while(1);
    input(s,a);

    printf("请输入数字串2:\n");
    do
    {
        gets(s);
        if(allDigit(s))
            break;
    }while(1);
    input(s,b);
    sign=sub(a,b);
    printf("计算结果是:");
    if(sign<0)
    {
        printf("-");
    }
    for(i=a[0];i>=1;i--)
    {
        printf("%d",a[i]);
    }
    printf("\n");

    return 0;

}
举报

相关推荐

0 条评论