C和指针--编程题9.14第10小题--判断回文函数

题目:

编写函数

  int palindrom( char *string);

如果参数字符串是个回文,函数就返回真,否则就返回假。回文就是指一个字符串从左向右读和从右向左读是一样的。函数应忽略所有的非字母字符,而且在进行字符比较时不用区分大小写。

前提是空白字符、标点符号和大小写状态被忽略,当Adam第1次遇到Eve时他可能会说的一句话:“Madam,I‘m Adam”就是回文一例。

分析题目,题目中没有规定空字符串和全是非字母字符的情况是否属于回文,我私自将空字符串归为回文,将全是非字母字符归为非回文,palindrom函数的编码实现思路如下:

  1. 当 strlen(string) <= 1。如果string的长度为0,则返回true;如果string的长度为1,如果是字母字符,返回true;否则返回false。
  2. 当strlen(string) >=2。

使用指针p指向字符串末尾,从两端(string指针从前到后,p指针从后向前)比较字母字符,*string和*p在都是字母字符的情况下,要么是相等关系,要么是大小写关系,一旦不符合回文条件则立马返回false。

根据思路编写代码如下,并使用“Madam,I‘m Adam”通过了测试。

 1 #include<iostream>
 2 #include<string.h>
 3 const static int BUFF_SIZE = 50;
 4 bool palindrome(char * str);
 5 int main(int argc, char *argv[])
 6 {
 7     char str[BUFF_SIZE];
 8     std::cout<<"enter a char[]: "<<std::endl;
 9     std::cin.getline(str, BUFF_SIZE);
10     std::cout<<"str: "<<str<<std::endl;
11     if(palindrome(str))
12     {
13         std::cout<<"\""<<str<<"\" is a palindrome\n";
14     }
15     else
16     {
17         std::cout<<"\""<<str<<"\" is not a palindrome\n";
18     }
19     return 0;
20 }
21 bool palindrome(char * str)
22 {
23     if(strlen(str) == 0)
24     {
25         std::cout<<"it is a null string\n";
26         return true;
27     }
28     if(strlen(str) == 1)
29     {
30         if(isalpha(*str))
31         {
32             return true;
33         }
34         else
35         {
36             std::cout<<"it has no alpha\n";
37             return false;
38         }
39     }
40     char * p = str;
41     while(‘\0‘ != *(++p))
42     {
43        // p++;
44     }
45     p--;
46     while(str < p)
47     {
48         while(!isalpha(*str))
49         {
50             if(‘\0‘ == *str)
51             {
52                 std::cout<<"it has no alpha\n";
53                 return false;
54             }
55             ++str;
56         }
57         while(!isalpha(*p))
58         {
59             --p;
60         }
61         if(islower(*str))
62         {
63             if((*p == *str) || (*p == *str - 32))
64             {
65                 ++str;
66                 p--;
67             }
68             else
69             {
70                 return false;
71             }
72         }
73         else
74         {
75             if((*p == *str) || (*p == *str + 32))
76             {
77                 ++str;
78                 --p;
79             }
80             else
81             {
82                 return false;
83             }
84         }
85     }
86 }

原文地址:https://www.cnblogs.com/jingliang10101/p/9804652.html

时间: 2024-08-14 16:44:02

C和指针--编程题9.14第10小题--判断回文函数的相关文章

《编程之美》4.10数字哑谜和回文

第一题:找出符合条件的九位数,每位数互不相同(1~9的某个排列),满足高n位能被n整除.例如abcdefghi,高两位ab能被2整除,高三位abc能被3整除,以此类推. 相对简单的一种解法 #include "stdafx.h" #include <iostream> using namespace std; void findNum(bool* used,int index,long sum) { if(index !=0 && sum%index !=

C语言-数组指针判断回文数

int num[5]={1,9,3,2,1}; int *p=num; int *q=&num[4]; int flag=1; for (; p<q; p++,q--) { if (*p!=*q) { flag=0; break; } } if (flag) { printf("回文数!\n"); }else{ printf("不是回文数"); } 版权声明:本文为博主原创文章,未经博主允许不得转载.

bzoj千题计划305:bzoj2565: 最长双回文串

https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100001 char ss[N]; int s[N]; int L1[N],L2[N]; struct

LeetCode第九题—— Palindrome Number(判断回文数)

题目描述 Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward. Example 1: Input: 121 Output: true Example 2: Input: -121 Output: false Explanation: From left to right, it reads -121. From rig

牛客网在线编程:统计回文数

题目描述: "回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B.现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串.你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串.如果字符串B插入的位置不同就考虑为不一样的办法.例如:A = "aba",B = "b&

C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数

各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所以返回 2. 进阶:你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗? 题目地址 https://leetcode-cn.com/problems/add-digits/ 代码模板 public class Solution { public int AddDigits

指针编程题

main.m文件 //1.输入10个整数,将其中最小的数与第一个数交换,把最大的数和最后一个数对换,写三个函数1.输入10个数,2.进行处理,3.输出10个数       int a[10] = {0};       int *p = NULL;       p = a;       //1.输入       inputArr(a, 10);       outputArr(a, 10);       printf("\n");       //2.处理函数       handleA

C指针编程之道 ---第一次笔记

//==================C指针编程之道===========================// /////////////第一次笔记//////////////// * 表示该变量为指针变量,这也是指针变量的特性. int *pStu; //定义指针变量pStu, 并且pStu指向int类型变量 static int *pStu; //定义指针变量pStu, 并且pStu指向静态整形变量 char *pStu;   //pStu是一个指针变量 取地址符& 和 取值运算符 * 通

三个 编程题 :1. 回文 2. 将字符串t连接到字符串s的尾部

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86