AAAAAABBCD
53342321
2019-11-17 12:38
采纳率: 84.2%
浏览 279

大神帮看我的关于大整数减法的答案哪里写错了

#include<string.h>
int main()
{
    int i,j=0;
    char ch[256]={};
    char th[256]={};
    char nh[256]={};
    int a[256]={0};
    int b[256]={0};
    int c[256]={0};
    int k=0;
    gets(ch);
    gets(th);
   int len1=strlen(ch);
   int len2=strlen(th);
   if(len1<len2){printf("-");
   strcpy(nh,th);
  strcpy(th,ch);
   strcpy(ch,nh);
   }
    for(i=len1-1;i>=0;i--)
      {
    a[j++]=ch[i]-'0';}
    j=0;
        for(i=len2-1;i>=0;i--)
      {
          b[j++]=th[i]-'0';}
          j=0;
          for(i=0;i<=255;i++)
          {
             if (a[i]-b[i]<0) {if(a[i+1]!=0){a[i+1]--;a[i]=a[i]+10-b[i];}
             else j=i+1;while(ch[j]==0){ch[j]=9;j++;}
             ch[j]--;a[i]=a[i]+10-b[i];}
             else a[i]-=b[i];
          }
          j=0;
          for(i=255;i>=0;i--)
          {
              c[j++]=a[i];
          }
          for(i=0;i<=255;i++)
          {
              if(c[i]!=0) k=1;
            if(k==1) printf("%d",c[i]);}
            if(k==0) printf("0");
     return 0;
}


求两个大的正整数相减的差。
输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。

我的思路是将字符串中的数字逆向赋予数组,然后进行从个位开始进行减法,最后再逆向清零,即得到最终答案

if (a[i]-b[i]<0) {if(a[i+1]!=0){a[i+1]--;a[i]=a[i]+10-b[i];}
             else j=i+1;while(ch[j]==0){ch[j]=9;j++;}
             ch[j]--;a[i]=a[i]+10-b[i];}
             else a[i]-=b[i];
                    问题应该是出在这个混乱的步骤里,这一步我想的是,如果不能减就要一直向前一位借位,但是好像写的不对
                    (如果不用借位的话应该是可以得到正确的答案)
                    希望大神在原有基础上帮我改一下
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • ZL1599292797
    QiQaWgYu 2019-11-17 15:35
    已采纳

    交换那一步可以增加一个条件,如果ch和th的长度一样并且ch小于th,这样就是大数减小数比较简单,加//的部分是改过的

    #include<stdio.h>
    #include<string.h>
    
    int compare(char a[], char b[]) {//判断a,b大小,a<b返回1
        if (strlen(a) == strlen(b)) {
            int i = 0;
            while (a[i] == b[i]) {
                i++;
            }
            if (i < strlen(a))
                return 1;
            else
                return 0;
        }
        else
            return 0;
    }
    
    int main()
    {
        int i, j = 0;
        char ch[256];
        char th[256];
        char nh[256];
        int a[256] = { 0 };
        int b[256] = { 0 };
        int c[256] = { 0 };
        int k = 0;
        gets(ch);
        gets(th);
        int len1 = strlen(ch);
        int len2 = strlen(th);
    
        if (len1 < len2 || compare(ch, th)) {//
            printf("-");
            k = len1;
            len1 = len2;
            len2 = k;
            strcpy(nh, th);
            strcpy(th, ch);
            strcpy(ch, nh);
        }
        for (i = len1 - 1; i >= 0; i--)
        {
            a[j++] = ch[i] - '0';
        }
        j = 0;
        for (i = len2 - 1; i >= 0; i--)
        {
            b[j++] = th[i] - '0';
        }
        j = 0;
        for (i = 0; i < len1; i++)
        {
            if (a[i] - b[i] < 0) {//
                if (a[i + 1] != 0) { 
                    a[i + 1]--; 
                    a[i] = a[i] + 10 - b[i]; 
                }
                else {
                    j = i + 1;
                    while (a[j] == 0 && j < len1)
                    {
                        a[j] = 9;
                        j++;
                    }
                    a[j]--;
                    a[i] = a[i] + 10 - b[i];
                }
            }
            else
                a[i] -= b[i];
        }
        j = 0;
        for (i = len1-1; i >= 0; i--)//
        {
            c[j++] = a[i];
        }
        for (i = 0; i <= len1-1; i++)//
        {
            if (c[i] != 0) k = 1;
            if (k == 1) printf("%d", c[i]);
        }
        if (k == 0) printf("0");
        return 0;
    }
    
    
    点赞 评论
  • caozhy

    if(len1 strcpy(nh,th);
    if (a[i]-b[i] else j=i+1;while(ch[j]==0){ch[j]=9;j++;}

    你写的什么东西,用编辑器里面的

    代码片

    贴正确

    图片说明

    点赞 评论

相关推荐