【C语言】回文

目录

1.回文定义

2.回文字符串

3.回文数

方法一:将该整数放入数组中,通过判断是否为回文字符串的方法来进行判断。

方法二:将该整数倒过来,与原数进行比较。


1.回文定义

回文,即将该字符串或数字反向排列后与原字符串或数字相同。

例如,"abcdcba"、12344321等。

2.回文字符串

题目:判断输入的字符串是否为回文。

解析:可将字符串首尾字符相比较,如相同,则继续比较第二个字符与倒数第二个字符,第三个字符与倒数第三个字符……直到比较到中间的数或字符不相等。

可定义指针*p,*q分别指向第一个字符与最后一个字符,若*p==*q,则让*p指向下一个字符,*q指向上一个字符,直到p>=q。

程序如下:

#include <stdio.h>
#include <string.h>
int hw(char *s)
{
    char *p,*q;
    p=s;    //让*p指向字符串第一个字符
    q=s+strlen(s)-1;    //让*q指向字符串最后一个字符
    while(p<q)    //依次比较,直到*p,*q指向的地址交叉或相等
    {
        if(*p==*q)
        {
            p++;
            q++;
        }
        else
            return 0;
     }
    return 1;
}
main()
{
    char s[100];
    gets(s);
    if(hw(s))
        printf("是回文\n");
    else
        printf("不是回文\n");
    return 0;
}

3.回文数

题目:判断输入的整数是否为回文数。

方法一:将该整数放入数组中,通过判断是否为回文字符串的方法来进行判断。

解析:可将该整数依次放入一个数组中,再延续判断回文字符串的方法进行比较。

程序如下:

#include <stdio.h>
#include <string.h>
int hws(int n)
{
	int num[100],*p,*q,i,j;
	for(i=0;n*10/10>0;i++)    //将整数放入数组中,此时数组中为倒序排列。
	{
		num[i]=n%10;
		n/=10;
	}
	for(j=0;j<i/2;j++)    //将数组中数改为正序排列,有没有结果都是一样的。
    {
		num[j]+=num[i-1-j];
        num[i-1-j]=num[j]-num[i-1-j];
        num[j]-=num[i-1-j];
    }
	p=num;    //让*p指向首地址
	q=num+i-1;    //让*q指向尾地址
	while(p<q)    //依次比较,直到*p,*q指向地址相同或交叉
	{
		if(*p==*q)
		{p++;q--;}
		else
			return 0;
	}
	return 1;
}
main()
{
	int n;
	scanf("%d",&n);    //输入该整数
	if(hws(n))    //用函数判断是否为回文数
		printf("是回文数\n");
	else
		printf("不是回文数\n");
	return 0;
}
方法二:将该整数倒过来,与原数进行比较。

解析:循环进行加上num对10取余并乘10,num除10。便可以将num反向排列。

程序如下:

#include <stdio.h>
#include <string.h>
int hws(int n1)
{
	int s=0,n2;    //定义s存放反序排列的num,定义n2记录num的值
	n2=n1;
	while(n1)    //将num反序排列并存入s中
	{
		s=s*10+n1%10;
		n1/=10;
	}
	return ((n2==s)?1:0);    //如果反序后的数等于原数,则为真,否则为假
}
main()
{
	int num;
	scanf("%d",&num);
	if(hws(num))
		printf("是回文\n");
	else
		printf("不是回文\n");
	return 0;
}

### C语言实现回文检查或生成 #### 回文检查算法 以下是基于引用中的方法,提供一种完整的C语言程序来检查给定字符串是否为回文: ```c #include <stdio.h> #include <string.h> int isPalindrome(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { if (str[i] != str[len - i - 1]) { return 0; // 不是回文 } } return 1; // 是回文 } int main() { char str[100]; printf("Enter a string: "); scanf("%s", str); if (isPalindrome(str)) { printf("%s is a palindrome.\n", str); } else { printf("%s is not a palindrome.\n", str); } return 0; } ``` 上述代码实现了简单的回文检测功能[^2]。函数 `isPalindrome` 遍历字符串的一半长度并逐字符对比首尾位置上的字符。 --- #### 数字类型的回文检查 对于整数型数据的回文检查可以采用类似的逻辑,但需要注意负号的影响以及数值反转的过程。以下是一个针对整数的回文检查示例: ```c #include <stdio.h> int reverseNumber(int num) { long reversed = 0; while (num > 0) { reversed = reversed * 10 + num % 10; num /= 10; } return (reversed >= INT_MAX || reversed <= INT_MIN) ? 0 : reversed; } bool isPalindrome(int x) { if (x < 0) { return false; // 负数不可能是回文 } return x == reverseNumber(x); } int main() { int x; printf("Enter an integer: "); scanf("%d", &x); if (isPalindrome(x)) { printf("%d is a palindrome number.\n", x); } else { printf("%d is not a palindrome number.\n", x); } return 0; } ``` 此代码片段展示了如何通过翻转数字并与原值比较的方式判断一个整数是否为回文数[^4]。 --- #### 动态规划求最长回文子串 如果目标是从较长字符串中提取最长的回文子串,则可利用动态规划的思想完成这一任务。下面给出一段参考代码: ```c #include <stdio.h> #include <string.h> void longestPalindromicSubstring(char* s, char* result) { int n = strlen(s); if (n == 0) { strcpy(result, ""); return; } bool dp[n][n]; memset(dp, 0, sizeof(dp)); int start = 0, maxLength = 1; for (int i = 0; i < n; ++i) { dp[i][i] = true; } for (int i = 0; i < n - 1; ++i) { if (s[i] == s[i + 1]) { dp[i][i + 1] = true; start = i; maxLength = 2; } } for (int length = 3; length <= n; ++length) { for (int i = 0; i < n - length + 1; ++i) { int j = i + length - 1; if (dp[i + 1][j - 1] && s[i] == s[j]) { dp[i][j] = true; start = i; maxLength = length; } } } strncpy(result, s + start, maxLength); result[maxLength] = '\0'; } int main() { char input[100], output[100]; printf("Enter a string: "); scanf("%s", input); longestPalindromicSubstring(input, output); printf("Longest palindromic substring: %s\n", output); return 0; } ``` 该代码使用二维布尔数组记录子串的状态,并逐步扩展可能成为更长回文的部分[^1]。 --- #### § 1. 如何优化时间复杂度为 O(n²) 的最长回文子串查找? 2. 是否可以用栈结构辅助验证链表形式的数据是否构成回文? 3. 如果允许忽略大小写和非字母字符,应怎样修改现有代码支持这种需求? 4. 对于超大字符串(超过内存容量),有哪些分布式计算策略可用于寻找其最大回文子序列? 5. 判断矩阵路径上形成的字符串是否为回文的方法是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值