判断一个数是否为回文数,字符串是否为回文字符串

使用C语言编写程序

判断一个数是否为回文数。(ps:回文数也是一个数字,数字的特点是正反序是同一个数字,如12321,3443就是回文数)。

要判断该数字是否为回文数,可以通过模除得到该数的反序数字,进行比较是否相等来判读。

具体实现如下:

void Practice()
{
	int num, value, flag, var;
	value = 0;
	flag = 1;
	scanf("%d", &num);
	var = num;
	while(num)
	{//value存储num的反序数字
		value = value * flag + num % 10;
		flag *= 10;
		num /= 10;
	}
	printf("value=%d\n", value);
	if (value == var)
	{
		printf("%d是回文数\n", var);
	}
	else
	{
		printf("%d不是回文数\n",var);
	}
}

判断一个字符串是否为回文字符串。(ps:回文字符串也是一个回文字符串,但原字符串和字符串逆序后一样,如abcba,cddc就是回文字符串)。

要判断字符串逆置后是否与原字符串一样,可以判断它是否对称。利用两个指针从该字符串两头向中间依次进行比较,判断是否相等,而结束点是begin==end(偶数个字符时)或++end==begin(奇数个字符时)。

具体实现如下:

void Practice()
{
	//char ch[] = "abcba";
	//char ch[] = "abccba";
	char ch[] = "abcrba";
	char* begin = ch;
	char* end = ch;
	while (*end != ‘\0‘)
	{
		end++;
	}
	end--;//使end指向字符串中的最后一个字符
	//while (!(begin == end || ++end == begin))//注意此处用++end
	//{
	//	end--;//由于while中++end,故使end重新指向
	//	if (*begin == *end)
	//	{
	//		begin++;
	//		end--;
	//	}
	//	else
	//	{
	//		printf("%s不是回文字符串\n", ch);
	//		return;
	//	}
	//}
	while (begin < end)
	{
		if (*begin != *end)
		{
			printf("%s不是回文字符串\n", ch);
			return;
		}
		begin++;
		end--;
	}
	printf("%s是回文字符串\n", ch);
}

也可以通过递归实现:

void Practice20()
{
	char ch1[] = "abcba";
	char ch2[] = "abccba";
	char ch3[] = "abcrba";
	char* end1 = ch1 + strlen(ch1) - 1;
	char* end2 = ch2 + strlen(ch2) - 1;
	char* end3 = ch1 + strlen(ch3) - 1;
	printf("%d\n", pld(ch1, end1));
	printf("%d\n", pld(ch2, end2));
	printf("%d\n", pld(ch3, end3));
}

int pld(char *begin, char *end)
{
	if (begin == NULL || end == NULL)
		return 0;
	if (begin == end || begin > end)
	{
		return 1;
	}
	if (*begin == *end)
	{
		pld(++begin, --end);
	}
}
时间: 2024-10-03 13:45:08

判断一个数是否为回文数,字符串是否为回文字符串的相关文章

回文数 第N个回文数

判断回文数还是不难,如果能转为字符串就更简单了. 如果是求第N个回文数呢. 12321是一个回文数,这里先考虑一半的情况. 回文数的个数其实是有规律的.如: 1位回文数: 9个 2位回文数: 9个 3位回文数: 90个 4位回文数: 90个 5位回文数: 900个 6位回文数: 900个 … 我们看到9.90.900,是不是很有规律,那是什么原因?很简单,我们把回文数拆开两半 [123321]来看.两半的变化一样的,那我们只算其中一半就行了.首位不能是0,所以左半最小为 100,最大为999,共

蓝桥杯 BASIC-7~9 特殊的数字、回文数、特殊的回文数

特殊的数字 [AC代码]: #include <iostream> #include <algorithm> #include <cstdio> using namespace std; int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); int i = 0; for (i = 10

输入任意一个5位数,判断其是否是回文数

输入任意一个5位数,判断其是否是回文数.所谓的回文数是指其个位与万位相同,并且十位与千位相同,比如:12321或者54645: #include <stdio.h>void main(){   int n=0;    printf("请输入任意一个5位数\n");    scanf("%d",&n);   n%10==n/10000&&(n/10)%10==(n/1000)%10 ? printf("%n是一个回文数&q

判断一个int 型整数 是否为回文数

leetcode 上的题目 Determine whether an integer is a palindrome. Do this without extra space. 由于不能使用额外空间,所以不能把数字转化为字符串后进行比较.因为这样空间复杂度将为线性. leetcode给出了几点提示 1.判断负数是否为回文数,查了下回文数定义,负数不为回文数 2.就是注意不能把数字转字符串,因为不能用额外空间. 3.如果打算反转数字,需要处理好数字溢出情况 我的解决办法: 先获取数字长度,然后获取

判断一个整数是否是回文数C++实现 leetcode系列(九)

判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 . 从右向左读, 为 121- .因此它不是一个回文数. 示例 3: 输入: 10 输出: false 解释: 从右向左读, 为 01 .因此它不是一个回文数. 这道验证回文数字的题如果将数字转为字符串,就变成了验证回文字符串的题,没啥难度了,我们就直接来做follow up吧

PAT 1079. 延迟的回文数

PAT 1079. 延迟的回文数 给定一个 k+1 位的正整数 N,写成 ak...a1a0 的形式,其中对所有 i 有 0 <= ai < 10 且 ak > 0.N 被称为一个回文数,当且仅当对所有 i 有 ai = ak-i.零也被定义为一个回文数. 非回文数也可以通过一系列操作变出回文数.首先将该数字逆转,再将逆转数与该数相加,如果和还不是一个回文数,就重复这个逆转再相加的操作,直到一个回文数出现.如果一个非回文数可以变出回文数,就称这个数为延迟的回文数.(定义翻译自 https

习题-四季-回文数-不死神兔

1-键盘录入月份,输出对应的季节.一年有四季;3,4,5春季;6,7,8夏季;9,10,11秋季;12,1,2冬季 public class Demo02Test {     public static void main(String[] args) {         // 键盘录入一个月份,用Scanner实现         Scanner sc = new Scanner(System.in);         // 接收数据         System.out.println("请

leetcode9 回文数

恩 注意观察输入是int X 说明有范围 并且有正负  特殊情况特判并且防溢出即可 负数,xxx0不会是回文数. 0是回文数 思路 先想itoa转char*然后头尾对比.但是时间空间开销有. 然后想直接int mod取首位但是首部不好取. 那就直接从尾部开始,取x的后一半翻转,对比前半部分. 辣么怎么判断到了一半奥 一般情况可以搞一个table判断先判断x的位数: final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999,

最长回文数

1:题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案.示例 2: 输入: "cbbd"输出: "bb" 来源:力扣(LeetCode) 2:题目分析 回文数是一种左右对称的字符串,如果从题目的背景一个大字符串出售,很容易使用暴力法,直接从1开始拓展成length-1长度