这两串代码逻辑一样,为什么做了一点小改动就不正确了呢?
如下#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;
}
第一个代码:
第二个代码:
两个代码的逻辑确实非常相似,但是有一个关键的区别,导致第二个代码不能正确工作。问题出在处理进位的地方。
在第一个代码中,当判断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;
}
}
}
这样修改之后,第二个代码应该能够正确处理进位的情况,使得两个代码的逻辑一致。 isdkz 发表于 2023-5-5 13:23
两个代码的逻辑确实非常相似,但是有一个关键的区别,导致第二个代码不能正确工作。问题出在处理进位的地方 ...
第二个代码能正确工作。。。第一个不行。哥
页:
[1]