鱼C论坛

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

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

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

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

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

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

  9.     gets(s);

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

  12.     t = strlen(s);

  13.     for(n = t - 1;n >= 0; n--)
  14.     {
  15.         if(s[n]*2 +temp - 96 > 9)
  16.         {
  17.             st[n+flag] = s[n]*2 - 58 + temp;
  18.             temp = 1;
  19.         }
  20.         else
  21.         {
  22.             st[n+flag] = s[n]*2 - 48 + temp;
  23.             temp = 0;
  24.         }
  25.     }
  26.    
  27.    
  28.     if(temp == 1)
  29.         st[n+1] = '1';

  30.     strcpy(demo_st,st);

  31.     for(n = 0;s[n] != '\0'; n++)
  32.     {
  33.         for(m = 0;demo_st[m] != '\0'; m++)
  34.         {
  35.             if(s[n] == demo_st[m])
  36.             {
  37.                 s[n] = 'x';
  38.                 demo_st[m] = 'x';
  39.                 break;
  40.             }
  41.         }
  42.     }

  43.     for(n = 0;demo_st[n] != '\0';n++)
  44.     {
  45.         if(demo_st[n] != 'x')
  46.         {
  47.             flag = 1;
  48.             break;
  49.         }
  50.     }

  51.     if(flag)
  52.     {
  53.         printf("No\n%s",st);
  54.     }
  55.     else
  56.     {
  57.         printf("Yes\n%s",st);
  58.     }
  59.    
  60.         return 0;
  61. }
复制代码



  1. #include<stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5.         char s[22];
  6.     char st[22];
  7.     char demo_st[22];
  8.     int n,m,t,flag = 0,temp = 0;

  9.     gets(s);


  10.     t = strlen(s);

  11.         if(s[0]*2 - 96 > 9)
  12.         {
  13.                 for(n = t - 1;n >= 0; n--)
  14.             {
  15.                 if(s[n]*2 +temp - 96 > 9)
  16.                 {
  17.                     st[n+1] = s[n]*2 - 58 + temp;
  18.                     temp = 1;
  19.                 }
  20.                 else
  21.                 {
  22.                     st[n+1] = s[n]*2 - 48 + temp;
  23.                     temp = 0;
  24.                 }
  25.             }
  26.         }
  27.         else
  28.         {
  29.                 for(n = t - 1;n >= 0; n--)
  30.             {
  31.                 if(s[n]*2 +temp - 96 > 9)
  32.                 {
  33.                     st[n] = s[n]*2 - 58 + temp;
  34.                     temp = 1;
  35.                 }
  36.                 else
  37.                 {
  38.                     st[n] = s[n]*2 - 48 + temp;
  39.                     temp = 0;
  40.                 }
  41.             }
  42.         }
  43.    
  44.    
  45.     if(temp == 1)
  46.         st[n+1] = '1';

  47.     strcpy(demo_st,st);

  48.     for(n = 0;s[n] != '\0'; n++)
  49.     {
  50.         for(m = 0;demo_st[m] != '\0'; m++)
  51.         {
  52.             if(s[n] == demo_st[m])
  53.             {
  54.                 s[n] = 'x';
  55.                 demo_st[m] = 'x';
  56.                 break;
  57.             }
  58.         }
  59.     }

  60.     for(n = 0;demo_st[n] != '\0';n++)
  61.     {
  62.         if(demo_st[n] != 'x')
  63.         {
  64.             flag = 1;
  65.             break;
  66.         }
  67.     }

  68.     if(flag)
  69.     {
  70.         printf("No\n%s",st);
  71.     }
  72.     else
  73.     {
  74.         printf("Yes\n%s",st);
  75.     }
  76.    
  77.         return 0;
  78. }
复制代码


第一个代码:
a17de517eed49d675b297affefc2bbb.png
第二个代码:
cd354050996fb955e801295649bc539.png
小甲鱼最新课程 -> https://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语句中,修改如下:

  1. if(s[0]*2 - 96 > 9)
  2. {
  3.     st[0] = '1';
  4.     for(n = t - 1;n >= 0; n--)
  5.     {
  6.         if(s[n]*2 +temp - 96 > 9)
  7.         {
  8.             st[n+1] = s[n]*2 - 58 + temp;
  9.             temp = 1;
  10.         }
  11.         else
  12.         {
  13.             st[n+1] = s[n]*2 - 48 + temp;
  14.             temp = 0;
  15.         }
  16.     }
  17. }
复制代码


这样修改之后,第二个代码应该能够正确处理进位的情况,使得两个代码的逻辑一致。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

第二个代码能正确工作。。。第一个不行。哥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 10:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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