鱼C论坛

 找回密码
 立即注册
查看: 660|回复: 4

[已解决]错在哪了啊 为什么输出都是NO

[复制链接]
发表于 2023-11-24 17:37:46 | 显示全部楼层 |阅读模式

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

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

x
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。现在呢,就是让你判断输入的字符串是否是回文串。

输入描述
有多组输入,每行输入一串字符,保证字符串长度不会大于 100000,字符串由大小写英文字母和空格组成,以字符串“2013”作为结束标志。

输出描述
每行输出一个字符串,如果输入是回文串,输出“YES”,否则输出“NO”(注意:判断的时候空格是不作判断的,详见样例)。

样例
输入
aaaa
ggg g
lozxvxoMJBCHsTXooXTsHCBJMoxvxzol
i am a good acmer
2013
输出
YES
YES
YES
NO
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     char a[100001];
  6.     while(1)
  7.     {
  8.         cin.getline(a,100001);
  9.         char *p=a;
  10.         int i,j,flag=1;
  11.         if(strcmp(a,"2013")==0) return 0;
  12.         i=0;
  13.         j=strlen(a);
  14.         for(;i!=j;i++,j--)
  15.         {
  16.             if(a[i]==' ') i++;
  17.             if(a[j]==' ') j--;
  18.             if(a[i]!=a[j])
  19.             {
  20.                 flag=0;
  21.                 break;
  22.             }
  23.         }
  24.         if(flag) cout<<"YES"<<endl;
  25.         else cout<<"NO"<<endl;
  26.     }
  27. }
复制代码
最佳答案
2023-11-24 18:25:38
两个地方,一是 j 的初始值不对,二是循环条件判断不对。初始值应当是 strlen(a)-1,否则 a[j] 的值将会是 '\0',从而直接跳出循环。循环条件的判断 i != j 应该为 i < j,否则 i 与 j 有可能值从 2、3 变为 3、2,直接进行下一轮循环。综上修改的代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     char a[100001];
  6.     while(1)
  7.     {
  8.         cin.getline(a,100001);
  9.         char *p=a;
  10.         int i,j,flag=1;
  11.         if(strcmp(a,"2013")==0) return 0;
  12.         i=0;
  13.         j=strlen(a)-1; //改了这里
  14.         for(;i<j;i++,j--) // 改了这里
  15.         {
  16.             if(a[i]==' ') i++;
  17.             if(a[j]==' ') j--;
  18.             if(a[i]!=a[j])
  19.             {
  20.                 flag=0;
  21.                 break;
  22.             }
  23.         }
  24.         if(flag) cout<<"YES"<<endl;
  25.         else cout<<"NO"<<endl;
  26.     }
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-24 17:38:16 | 显示全部楼层
问题出在两个地方:
1. 输入的字符串应该使用字符数组来保存,而不是单个字符变量。
2. 判断是否是回文串的逻辑有误。

以下是修改后的代码:
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int main()
  5. {
  6.     char a[100001];
  7.     while(true)
  8.     {
  9.         cin.getline(a, 100001);
  10.         if(strcmp(a, "2013") == 0) // 判断输入是否为结束标志
  11.             return 0;
  12.         int len = strlen(a);
  13.         int i = 0, j = len - 1;
  14.         int flag = 1;
  15.         while(i < j)
  16.         {
  17.             if(a[i] == ' ') // 跳过空格
  18.             {
  19.                 i++;
  20.                 continue;
  21.             }
  22.             if(a[j] == ' ')
  23.             {
  24.                 j--;
  25.                 continue;
  26.             }
  27.             if(a[i] != a[j]) // 判断字符是否相等
  28.             {
  29.                 flag = 0;
  30.                 break;
  31.             }
  32.             i++;
  33.             j--;
  34.         }
  35.         if(flag)
  36.             cout << "YES" << endl;
  37.         else
  38.             cout << "NO" << endl;
  39.     }
  40.     return 0;
  41. }
复制代码

这样修改后,可以正确判断输入的字符串是否是回文串。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 17:38:43 | 显示全部楼层
非常抱歉,我之前的回答有误。你的代码逻辑是正确的,并没有问题。我会尽快为你提供修复后的代码。
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. bool isPalindrome(const string& s)
  5. {
  6.     int i = 0;
  7.     int j = s.length() - 1;
  8.    
  9.     while (i < j)
  10.     {
  11.         if (s[i] == ' ')
  12.         {
  13.             i++;
  14.             continue;
  15.         }
  16.         
  17.         if (s[j] == ' ')
  18.         {
  19.             j--;
  20.             continue;
  21.         }
  22.         
  23.         if (s[i] != s[j])
  24.             return false;
  25.         
  26.         i++;
  27.         j--;
  28.     }
  29.    
  30.     return true;
  31. }
  32. int main()
  33. {
  34.     char a[100001];
  35.     while (1)
  36.     {
  37.         cin.getline(a, 100001);
  38.         int i, j, flag = 1;
  39.         
  40.         if (strcmp(a, "2013") == 0)
  41.             return 0;
  42.         
  43.         i = 0;
  44.         j = strlen(a) - 1;
  45.         
  46.         for (; i != j; i++, j--)
  47.         {
  48.             if (a[i] == ' ')
  49.                 i++;
  50.             
  51.             if (a[j] == ' ')
  52.                 j--;
  53.             
  54.             if (a[i] != a[j])
  55.             {
  56.                 flag = 0;
  57.                 break;
  58.             }
  59.         }
  60.         
  61.         if (flag)
  62.             cout << "YES" << endl;
  63.         else
  64.             cout << "NO" << endl;
  65.     }
  66.    
  67.     return 0;
  68. }
复制代码

再次对之前的错误致以深深的歉意。希望这次能够帮助到你!如果还有其他问题,请随时提问。

回复来自于CHAT-GPT。回复仅供参考,如有人工回答,最佳答案请优先选择人工
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 18:00:24 | 显示全部楼层
本帖最后由 jackz007 于 2023-11-24 18:19 编辑
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     char a[100001];
  6.     while(1)
  7.     {
  8.         cin.getline(a,100001);
  9.         char *p=a;
  10.         int i,j,flag=1;
  11.         if(strcmp(a,"2013")==0) return 0 ;
  12.         i=0;
  13.         j=strlen(a)  ;                      // 记住这里 j = strlen(a)     
  14.         for(;i!=j;i++,j--)
  15.         {
  16.             if(a[i]==' ') i++;
  17.             if(a[j]==' ') j--;              // 所以,在首次循环中,a[j] 的值一定是 '\0'
  18.             if(a[i]!=a[j])                  // 所以,在首次循环中,a[i] != a[j] 一定成立!
  19.             {
  20.                 flag=0;                     // 所以,在首次循环中,一定会得到否定的判断
  21.                 break;
  22.             }
  23.         }
  24.         if(flag) cout<<"YES"<<endl;
  25.         else cout<<"NO"<<endl;
  26.     }
  27. }
复制代码

        修改了一个版本,供楼主参考:
  1. #include<bits/stdc++.h>
  2. using namespace std                            ;
  3. int main()
  4. {
  5.         char a[100001]                         ;
  6.         int i , j , flag                       ;
  7.         for(;;)
  8.         {
  9.                 cin . getline(a , 100001)      ;
  10.                 if(! strcmp(a , "2013")) break ;
  11.                 for(i = 0 , j = strlen(a) , flag = 1 ; i < j ; i ++ , j --)
  12.                 {
  13.                         if(a[i] != a[j - 1])
  14.                         {
  15.                                 flag = 0       ;
  16.                                 break          ;
  17.                         }
  18.                 }
  19.                 if(flag) cout << "YES" << endl ;
  20.                 else cout << "NO" << endl      ;
  21.         }
  22.         cout << "Bye-Bye!" << endl             ;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 18:25:38 | 显示全部楼层    本楼为最佳答案   
两个地方,一是 j 的初始值不对,二是循环条件判断不对。初始值应当是 strlen(a)-1,否则 a[j] 的值将会是 '\0',从而直接跳出循环。循环条件的判断 i != j 应该为 i < j,否则 i 与 j 有可能值从 2、3 变为 3、2,直接进行下一轮循环。综上修改的代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     char a[100001];
  6.     while(1)
  7.     {
  8.         cin.getline(a,100001);
  9.         char *p=a;
  10.         int i,j,flag=1;
  11.         if(strcmp(a,"2013")==0) return 0;
  12.         i=0;
  13.         j=strlen(a)-1; //改了这里
  14.         for(;i<j;i++,j--) // 改了这里
  15.         {
  16.             if(a[i]==' ') i++;
  17.             if(a[j]==' ') j--;
  18.             if(a[i]!=a[j])
  19.             {
  20.                 flag=0;
  21.                 break;
  22.             }
  23.         }
  24.         if(flag) cout<<"YES"<<endl;
  25.         else cout<<"NO"<<endl;
  26.     }
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 19:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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