C语言回文判断与输出:算法详解及代码实现89


回文(Palindrome)是指正读和反读都一样的字符串或数字,例如“level”、“madam”、“121”等。判断一个字符串或数字是否为回文,以及如何用C语言输出回文,是编程学习中一个常见的练习题,也体现了算法设计和字符串处理的技巧。

本文将深入探讨C语言中回文判断和输出的多种方法,包括使用循环、递归以及库函数等方式,并对不同方法的效率进行分析,最终提供一个完善的、易于理解和扩展的C语言代码示例。

一、回文判断算法

判断一个字符串或数字是否为回文,核心思想是比较其首尾字符(或数字)。如果首尾字符相同,则继续比较下一个首尾字符;直到首尾指针相遇或发现不相同的字符。如果所有比较的首尾字符都相同,则该字符串或数字为回文。

1. 使用循环进行判断


这是最常用的方法,其核心思想是用两个指针,一个指向字符串的开头,另一个指向字符串的结尾,逐个比较字符。代码如下:```c
#include
#include
#include
bool isPalindrome(const char *str) {
int len = strlen(str);
int left = 0;
int right = len - 1;
while (left < right) {
if (str[left] != str[right]) {
return false;
}
left++;
right--;
}
return true;
}
int main() {
char str1[] = "level";
char str2[] = "hello";
if (isPalindrome(str1)) {
printf("%s is a palindrome.", str1);
} else {
printf("%s is not a palindrome.", str1);
}
if (isPalindrome(str2)) {
printf("%s is a palindrome.", str2);
} else {
printf("%s is not a palindrome.", str2);
}
return 0;
}
```

这段代码首先计算字符串长度,然后使用两个指针从两端向中间遍历,比较字符是否相等。如果不相等,则立即返回false;如果遍历完成,则返回true。

2. 使用递归进行判断


递归方法也能够实现回文判断,其思路是:如果字符串长度为0或1,则为回文;否则,比较首尾字符,如果相同,则递归调用函数判断剩下的子串是否为回文。```c
#include
#include
#include
bool isPalindromeRecursive(const char *str, int left, int right) {
if (left >= right) {
return true;
}
if (str[left] != str[right]) {
return false;
}
return isPalindromeRecursive(str, left + 1, right - 1);
}
int main() {
char str1[] = "level";
char str2[] = "hello";
if (isPalindromeRecursive(str1, 0, strlen(str1) - 1)) {
printf("%s is a palindrome.", str1);
} else {
printf("%s is not a palindrome.", str1);
}
if (isPalindromeRecursive(str2, 0, strlen(str2) - 1)) {
printf("%s is a palindrome.", str2);
} else {
printf("%s is not a palindrome.", str2);
}
return 0;
}
```

递归方法简洁优雅,但对于非常长的字符串,可能会导致栈溢出。

二、输出回文

除了判断一个字符串是否为回文,我们还可以生成回文或者输出特定长度的回文。

1. 生成回文


我们可以通过将一个字符串与其逆序连接起来生成回文。例如,字符串“abc”可以生成回文“abccba”。```c
#include
#include
#include
char* generatePalindrome(const char *str) {
int len = strlen(str);
int newLen = 2 * len;
char *palindrome = (char *)malloc((newLen + 1) * sizeof(char));
strcpy(palindrome, str);
for (int i = 0; i < len; i++) {
palindrome[newLen - 1 - i] = str[i];
}
palindrome[newLen] = '\0';
return palindrome;
}
int main() {
char str[] = "abc";
char *palindrome = generatePalindrome(str);
printf("Generated palindrome: %s", palindrome);
free(palindrome); //释放内存
return 0;
}
```

2. 输出特定长度的回文


我们可以编写函数来生成指定长度的回文。例如,生成长度为5的回文,可以是“12321”,"abcba"等。 这需要一定的算法设计,可以考虑使用数字或字符的组合,并保证其正反相等。
```c
#include
#include
void generatePalindromeNumber(int n) {
if (n

2025-05-11


上一篇:C语言EOF函数详解:使用方法、常见问题及最佳实践

下一篇:C语言函数输出结果详解:从原理到调试技巧