鱼C论坛

 找回密码
 立即注册
查看: 1168|回复: 2

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

[复制链接]
发表于 2023-5-5 13:09:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

    gets(s);

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

    t = strlen(s);

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

    strcpy(demo_st,st);

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

    for(n = 0;demo_st[n] != '\0';n++)
    {
        if(demo_st[n] != '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[22];
    char st[22];
    char demo_st[22];
    int n,m,t,flag = 0,temp = 0;

    gets(s);


    t = strlen(s);

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

    strcpy(demo_st,st);

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

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

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

第一个代码:
a17de517eed49d675b297affefc2bbb.png
第二个代码:
cd354050996fb955e801295649bc539.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

解决方法是在第二个代码的if语句中,当需要进位时,将st的最高位设为'1',然后开始遍历字符串s。这样,第二个代码应该可以正确工作。在第二个代码的if语句中,修改如下:
if(s[0]*2 - 96 > 9)
{
    st[0] = '1';
    for(n = t - 1;n >= 0; n--)
    {
        if(s[n]*2 +temp - 96 > 9)
        {
            st[n+1] = s[n]*2 - 58 + temp;
            temp = 1;
        }
        else
        {
            st[n+1] = s[n]*2 - 48 + temp;
            temp = 0;
        }
    }
}

这样修改之后,第二个代码应该能够正确处理进位的情况,使得两个代码的逻辑一致。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

第二个代码能正确工作。。。第一个不行。哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 01:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表