c语言怎么判断回文数列

回文是指一个字符串正读和反读都一样的字符串,在C语言中,我们可以通过比较字符串的首尾字符来判断一个字符串是否为回文,如果首尾字符相等,那么我们可以将首尾字符去掉,继续判断剩下的字符串是否为回文,如果首尾字符不相等,那么这个字符串就不是回文,这个过程可以通过循环来实现。

(图片来源网络,侵删)

下面是一个C语言实现判断回文的程序:

#include <stdio.h>
#include <string.h>
int is_palindrome(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        if (str[i] != str[len 1 i]) {
            return 0;
        }
    }
    return 1;
}
int main() {
    char str[100];
    printf("请输入一个字符串:");
    scanf("%s", str);
    if (is_palindrome(str)) {
        printf("这是一个回文字符串。
");
    } else {
        printf("这不是一个回文字符串。
");
    }
    return 0;
}

程序首先定义了一个is_palindrome函数,用于判断一个字符串是否为回文,在这个函数中,我们首先获取字符串的长度,然后通过一个循环来比较字符串的首尾字符,如果首尾字符不相等,那么返回0表示这个字符串不是回文,如果循环结束后都没有发现不相等的首尾字符,那么返回1表示这个字符串是回文。

main函数中,我们首先定义了一个长度为100的字符数组str,用于存储用户输入的字符串,然后通过scanf函数获取用户输入的字符串,并将其存储到str数组中,接下来,我们调用is_palindrome函数来判断用户输入的字符串是否为回文,如果是回文,那么输出“这是一个回文字符串。”;如果不是回文,那么输出“这不是一个回文字符串。”。

需要注意的是,这个程序只能判断单个单词的回文,如果要判断整个句子的回文,还需要对空格进行处理,对于句子“上海自来水来自海上”,我们需要将其转换为“上海自来水来自海上”才能正确判断其是否为回文,这可以通过将输入的字符串中的空格去掉来实现,下面是修改后的代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int is_palindrome(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        if (str[i] != str[len 1 i]) {
            return 0;
        }
    }
    return 1;
}
int main() {
    char str[100];
    printf("请输入一个字符串:");
    scanf("%s", str);
    int len = strlen(str);
    for (int i = 0; i < len; i++) {
        if (isspace(str[i])) { // 如果遇到空格,跳过后面的字符
            memmove(&str[i], &str[i + 1], len i); // 将后面的字符向前移动一位,覆盖掉空格和后面的字符
            len; // 更新字符串长度
            i; // 更新循环变量i,以便重新检查当前位置的字符是否为空格
        } else if (isalpha(str[i])) { // 如果遇到字母,跳过后面的非字母字符(包括空格)
            while (!isalpha(str[i + 1])) { // 向后查找下一个字母字符的位置
                memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非字母字符向前移动一位,覆盖掉后面的非字母字符和空格
                len; // 更新字符串长度
            }
            memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非字母字符向前移动一位,覆盖掉后面的非字母字符和空格
            len; // 更新字符串长度
        } else if (ispunct(str[i])) { // 如果遇到标点符号,跳过后面的非标点符号字符(包括空格)
            while (!ispunct(str[i + 1])) { // 向后查找下一个标点符号字符的位置
                memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非标点符号字符向前移动一位,覆盖掉后面的非标点符号字符和空格
                len; // 更新字符串长度
            }
            memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非标点符号字符向前移动一位,覆盖掉后面的非标点符号字符和空格
            len; // 更新字符串长度
        } else if (isdigit(str[i])) { // 如果遇到数字,跳过后面的非数字字符(包括空格)
            while (!isdigit(str[i + 1])) { // 向后查找下一个数字字符的位置
                memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非数字字符向前移动一位,覆盖掉后面的非数字字符和空格
                len; // 更新字符串长度
            }
            memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非数字字符向前移动一位,覆盖掉后面的非数字字符和空格
            len; // 更新字符串长度
        } else { // 如果遇到其他字符,跳过它和后面的所有字符(包括空格)
            while (isprint(str[i + 1])) { // 向后查找下一个可打印字符的位置(即跳过所有不可打印字符)
                memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的不可打印字符向前移动一位,覆盖掉后面的不可打印字符和空格
                len; // 更新字符串长度
            }
        }
    }
    if (is_palindrome(str)) { // 如果处理后的字符串长度大于0且为回文,输出结果并释放内存空间(因为处理后的字符串可能与原始字符串不同)
        printf("这是一个回文字符串。
");
        free(str); // 释放内存空间(如果需要的话)
    } else { // 如果处理后的字符串长度不大于0或不为回文,输出结果并释放内存空间(因为处理后的字符串可能与原始字符串不同)

评论列表

王磊
王磊
2024-03-13

通过编写C语言程序,我们可以轻松地判断一个数列是否为回文数列,这不仅有助于加深对编程逻辑的理解,还能提高我们的算法设计能力。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。