本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
函数接口定义:
bool palindrome( char *s );
函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXN 20
typedef enum {
false, true} bool;
bool palindrome( char *s );
int main()
{
char s[MAXN];
scanf("%s", s);
if ( palindrome(s)==true )
printf("Yes\n");
else
printf("No\n");
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
thisistrueurtsisiht
输出样例1:
Yes
thisistrueurtsisiht
输入样例2:
thisisnottrue
输出样例2:
No
thisisnottrue
题解:
/*小知识:typedef enum {false, true} bool;
typedef重新命名;
枚举enum {false, true} bool; bool为枚举变量
大概的意思就是重新命名枚举enum然后bool可以当定义数据的标识符,bool里面有两个值分别是true和false
*/
/*方法一:利用指针,定义新指针指向s数组的最后一个元素,然后定一个中间结点,前后两两判断,只要有不一样的就不是回文*/
bool palindrome( char *s )
{
int i; //循环变量
char *p = s + strlen (s) - 1; //定义新指针p指向s数组的最后一个元素(s是s数组的首地址加上s数组的长度减一,就是最后一个元素的地址,因为c语言下标从0开始,所以需要减一)
bool flag = true; //定义布尔型变量flag判断是否是回文数,初值为ture
/*循环判断前后元素是否一样*/
// for (i = 0; s [i] != '\0' ; i++, p-- , s++) //上下两种循环都行
for (i = 0; i < strlen (s) ; i++, p-- , s++) //循环开始i赋值为0,到小于s数组的长度位置,每一轮循环不要忘记i循环变量要加一,指针变量p由于是指向最后一位元素,所以需要减减指向上一个元素,而指针s是指向首地址的所以需要加加指向下一个元素
{
if (*p != *s) //如果前后一一对应的元素有不一样的就flag赋值为false,直接退出循环
{
flag = false;
break;
}
}
return flag; //返回flag的值给palindrome函数
}
/*方法二:利用新数组,把旧数组的倒序给新数组看看结果是否相等*/
// bool palindrome( char *s )
// {
// int i; //循环变量
// char p [MAXN]; //新数组
// bool flag = true; //定义布尔型变量flag判断是否是回文数,初值为ture
// int j = 0; //数组下标变量,初值为0
// /*数组s逆序循环赋值给新数组p*/
// for (i = strlen(s) - 1; i >= 0 ; i--) //逆序的初值是数组s的长度减一,因为c语言数组是从0开始的
// {
// p [j++] = s [i];
// }
// p [j] = '\0'; //字符串结束标识不要忘记
// if (strcmp(s,p) != 0) flag = false; //所以要是返回值不等于0就表示两个数组不一样,flag赋值为false
// /*strcmp函数判断两个数组是否相等,返回1表示s>p;返回-1表示s<p;返回0表示s=p*/
// return flag; //返回flag的值给palindrome函数
// }
/*方法三:方法一的数组形式*/
// bool palindrome( char *s )
// {
// int i; //循环变量
// bool flag = true; //定义布尔型变量flag判断是否是回文数,初值为ture
// int j = strlen (s) - 1; //另一个s数组的下标,指向s数组的最后一个元素
// /*循环判断前后元素是否一样*/
// // for (i = 0; i < strlen (s) ; i++)
// for (i = 0; s [i] != '\0' ; i++) //上下两种循环方式都可以
// {
// if (s [j--] != s [i]) //如果前后一一对应的元素有不一样的就flag赋值为false,直接退出循环
// {
// flag = false;
// break;
// }
// }
// return flag; //返回flag的值给palindrome函数
// }