NOIP 提高组初赛 · NOIP 2013 提高组初赛试题 第 23 题

选择题 · 答案 Yes · 考点:字符数组与字符串处理

← 整套速查表 NOIP 提高组初赛 全部真题

题目

#include <stdio.h> 
#include <string.h> 
const int SIZE = 100; 
int main() { 
 int n, i, isPlalindrome; 
 char str[SIZE]; 
 scanf("%s", str); 
 n = strlen(str); 
 isPlalindrome = 1; 
 for (i = 0; i < n/2; i++) { 
  if (str[i] != str[n-i-1]) isPlalindrome = 0; 
 } 
 if (isPlalindrome) 
  printf("Yes\n"); 
 else 
  printf("No\n"); 
 return 0; 
} 

输入:abceecba 输出:_________

答案:Yes

考点

字符数组与字符串处理 讲解 →字符数组与字符串处理 真题汇总 →

解题思维

这题考字符串回文判断。拿到题别急着跑,先看循环边界:n/2 向下取整,偶数串只比一半,奇数串中间那个自动跳过,这是命题人最爱挖的坑。

常见错误

最容易错的是把 n/2 理解成向上取整或者以为要比较到 n-1,导致多比或少比;还有把 strlen 当成包含\0,算错 n 值;另外有些同学会纠结奇偶长度,其实代码里 n/2 对奇偶都天然正确,不用特判。

详细解析(节选)

考点透视

这题表面是写个回文判断,实则在考你对 C 语言字符串处理细节的敏感度,尤其是 strlen 返回值、数组下标边界、以及循环终止条件的理解。命题人特别喜欢在这种基础题里埋‘边界陷阱’,比如把 n/2 写成 (n+1)/2,或者让循环跑到 n-1,导致多比一次或者少比一次。

代码逻辑拆解

程序核心就这几行:

int n = strlen(str);
int isPlalindrome = 1;
for (i = 0; i < n/2; i++) {
    if (str[i] != str[n-i-1]) isPlalindrome = 0;
}

第一句用 strlen 拿到字符串长度,注意它返回的是有效字符数,不包含结尾的\0。第二句初始化标志位为 1,表示默认是回文。第三句循环从 0 跑到 n/2-1,每次比较 str[i] 和 str[n-i-1],这是典型的‘头尾对称’写法:i=0 时比首尾,i=1 时比次首次尾,以此类推。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断