a905448839 发表于 2023-5-5 13:09:30

这两串代码逻辑一样,为什么做了一点小改动就不正确了呢?

如下
#include<stdio.h>
#include <string.h>
int main()
{
        char s;
    char st;
    char demo_st;
    int n,m,t,flag = 0,temp = 0;

    gets(s);

    if(s*2 - 96 > 9)
    flag = 1;

    t = strlen(s);

    for(n = t - 1;n >= 0; n--)
    {
      if(s*2 +temp - 96 > 9)
      {
            st = s*2 - 58 + temp;
            temp = 1;
      }
      else
      {
            st = s*2 - 48 + temp;
            temp = 0;
      }
    }
   
   
    if(temp == 1)
        st = '1';

    strcpy(demo_st,st);

    for(n = 0;s != '\0'; n++)
    {
      for(m = 0;demo_st != '\0'; m++)
      {
            if(s == demo_st)
            {
                s = 'x';
                demo_st = 'x';
                break;
            }
      }
    }

    for(n = 0;demo_st != '\0';n++)
    {
      if(demo_st != 'x')
      {
            flag = 1;
            break;
      }
    }

    if(flag)
    {
      printf("No\n%s",st);
    }
    else
    {
      printf("Yes\n%s",st);
    }
   
        return 0;
}




#include<stdio.h>
#include <string.h>
int main()
{
        char s;
    char st;
    char demo_st;
    int n,m,t,flag = 0,temp = 0;

    gets(s);


    t = strlen(s);

        if(s*2 - 96 > 9)
        {
                for(n = t - 1;n >= 0; n--)
          {
                if(s*2 +temp - 96 > 9)
                {
                    st = s*2 - 58 + temp;
                    temp = 1;
                }
                else
                {
                    st = s*2 - 48 + temp;
                    temp = 0;
                }
          }
        }
        else
        {
                for(n = t - 1;n >= 0; n--)
          {
                if(s*2 +temp - 96 > 9)
                {
                    st = s*2 - 58 + temp;
                    temp = 1;
                }
                else
                {
                    st = s*2 - 48 + temp;
                    temp = 0;
                }
          }
        }
   
   
    if(temp == 1)
        st = '1';

    strcpy(demo_st,st);

    for(n = 0;s != '\0'; n++)
    {
      for(m = 0;demo_st != '\0'; m++)
      {
            if(s == demo_st)
            {
                s = 'x';
                demo_st = 'x';
                break;
            }
      }
    }

    for(n = 0;demo_st != '\0';n++)
    {
      if(demo_st != 'x')
      {
            flag = 1;
            break;
      }
    }

    if(flag)
    {
      printf("No\n%s",st);
    }
    else
    {
      printf("Yes\n%s",st);
    }
   
        return 0;
}

第一个代码:

第二个代码:

isdkz 发表于 2023-5-5 13:23:46

两个代码的逻辑确实非常相似,但是有一个关键的区别,导致第二个代码不能正确工作。问题出在处理进位的地方。

在第一个代码中,当判断s * 2 - 96 > 9时,设置flag为1,表示可能需要进位。然后在遍历字符串s的过程中,使用变量temp来表示是否需要进位。而在第二个代码中,将这个判断移到了遍历过程中。

问题在于第二个代码将flag的作用与temp的作用混淆了。在第一个代码中,flag用于表示最高位是否需要进位,并且在计算st的过程中考虑了这个进位。但在第二个代码中,当s * 2 - 96 > 9时,没有对st的最高位进行处理。因此,当需要进位时,第二个代码没有正确处理最高位。

解决方法是在第二个代码的if语句中,当需要进位时,将st的最高位设为'1',然后开始遍历字符串s。这样,第二个代码应该可以正确工作。在第二个代码的if语句中,修改如下:

if(s*2 - 96 > 9)
{
    st = '1';
    for(n = t - 1;n >= 0; n--)
    {
      if(s*2 +temp - 96 > 9)
      {
            st = s*2 - 58 + temp;
            temp = 1;
      }
      else
      {
            st = s*2 - 48 + temp;
            temp = 0;
      }
    }
}


这样修改之后,第二个代码应该能够正确处理进位的情况,使得两个代码的逻辑一致。

a905448839 发表于 2023-5-5 13:41:01

isdkz 发表于 2023-5-5 13:23
两个代码的逻辑确实非常相似,但是有一个关键的区别,导致第二个代码不能正确工作。问题出在处理进位的地方 ...

第二个代码能正确工作。。。第一个不行。哥
页: [1]
查看完整版本: 这两串代码逻辑一样,为什么做了一点小改动就不正确了呢?