如何用c语言统计回文数

【描述】
输入一段文本,统计中间出现次数最多的回文数。回文数是类似12321,1221这样,顺序和逆序相同的十进制无符号整数,不考虑符号,长度至少为2,不能以0开始。另外,不考虑数的一部分,即abc1232abc中的232不是一个单独的数。(数据可能超过32位)
【输入】
输入数据为一段文本,可能包含若干行,直到文件末尾为止。即只有一组测试用例。
【输出】
对于每一组输入数据,输出出现次数最多的回文数和它出现的次数。如果有多个,按从小到大输出,每个数占一行。如果没有, 输出None。
样例输入
Thin34543king 121 is8 interesting121.
I like121 thinking23.
输出
121 3
【提示】
本题虽然是找整数,但最好的方法是全部按字符串来处理

这个题目只考虑数字部分,需要提取数数字部分来进行判断

img

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define MAXLEN 100
typedef struct _huiwenNmb
{
    char data[MAXLEN];
    int cnt; //出现次数
}Hwc;
//判断字符串是否是回文
int huiwen(char a[]) 
{
    int t = strlen(a) - 1;
    if (t == 0) return 0; //忽略单个字符的情况
    for (int i = 0; i < t; i++, t--) 
    {
        if (a[i] != a[t])
            return 0;  //是则返回1,不是返回0 
    }
    return 1;
}
//判断字符是否是数字
int isNumber(char c)
{
    if (c >= '0' && c <= '9')
        return 1;
    else
        return 0;
}
//判断回文串是否已经出现过
int isExist(Hwc a[], int n, char* p)
{
    int i;
    for (i = 0; i < n; i++)
    {
        if (strcmp(a[i].data, p) == 0)
            return i;
    }
    return -1;
}
//根据出现次数排序
void bubbleSort(Hwc a[], int n)
{
    int i, j;
    Hwc t;
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (a[j].cnt < a[j + 1].cnt)
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
}
int main()
{
    char buf[500];
    int nmb = 0;
    int i, j,t;
    int index = -1;
    Hwc a[100];
    int k = 0;
    while (1)
    {
        //读取字符串
        k=0;
        while(1)
        {
            t = getchar();
            if(t==EOF || t=='\n')
            {
                buf[k]=0;
                break;
            }else
            {
                buf[k] = t;
                k++;
            }
        }
        if(t == EOF)
            break;
        //提取字符串中的数字部分并判断是否是回文串
        i = 0;
        while (buf[i] != '\0')
        {
            while (buf[i] != '\0')
            {
                while (buf[i] != '\0' && (!isNumber(buf[i]))) //找到数字字符
                    i++;
                if (buf[i] == '\0')
                    break;
                if (buf[i] != '0')
                    break;
                else
                    i++; //如果开头是0,跳过,继续判断
            }
            if (buf[i] == '\0')
                break;
            //将数字字符保存出来
            j = 0;
            while (buf[i]!='\0' && isNumber(buf[i]))
            {
                a[nmb].data[j] = buf[i];
                i++;
                j++;
            }
            a[nmb].data[j] = 0; //结束符
            //判断是否是回文串
            if (huiwen(a[nmb].data))
            {
                //判断回文串是否已经出现过
                index = isExist(a, nmb, a[nmb].data);
                if (index == -1) //没有出现过
                {
                    a[nmb].cnt = 1;
                    nmb++;
                }
                else
                    a[index].cnt += 1; //出现过
            }
        }
    }
    if(nmb==0)
    {
        printf("Node");
        return 0;
    }
    //根据出现次数排序
    bubbleSort(a, nmb);
    i = 0;
    while (1)
    {
        printf("%s %d\n", a[i].data, a[i].cnt);
        if (i + 1 < nmb && a[i + 1].cnt == a[i].cnt) //如果有多个回文出现次数相等
            i++;
        else
            break;
    }
    return 0;
}


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632