Palindromic Numbers (III)(回文数,较麻烦)

本文介绍了一种算法,用于找出大于给定数字的最小回文数。通过分析输入数字的特性,该算法能够高效地找到解决方案,并附带了一个完整的C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Palindromic Numbers (III)
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

Description

Vinci is a little boy and is very creative. One day his teacher asked him to write all the Palindromic numbers from 1 to 1000. He became very frustrated because there is nothing creative in the task. Observing his expression, the teacher replied, "All right then, you want hard stuff, you got it." Then he asks Vinci to write a palindromic number which is greater than the given number. A number is called palindromic when its digits are same from both sides. For example: 1223221, 121, 232 are palindromic numbers but 122, 211, 332 are not. As there can be multiple solutions, Vinci has to find the number which is as small as possible.

Input

Input starts with an integer T (≤ 30), denoting the number of test cases.

Each case starts with a line containing a positive integer. This integer can be huge and can contain up to 105 digits.

Output

For each case, print the case number and the minimum possible palindromic number which is greater than the given number.

Sample Input

5

121

1

1332331

11

1121

Sample Output

Case 1: 131

Case 2: 2

Case 3: 1333331

Case 4: 22

Case 5: 1221

Hint

Dataset is huge, use faster I/O methods.


AC CODE:

//Memory: 1608 KB		Time: 82 MS
//Language: C++		Result: Accepted

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

char s[100001];

int main()
{
    int T, c = 1;
    int i, j, len, mid;
    bool odd, flag;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%s", s);
        printf("Case %d: ", c++);
        //特判所有digit为9的情况
        for(i = 0; s[i] == '9'; i++){}
        if(s[i] == '\0')
        {
            putchar('1');
            for(i = 0; s[i+1] != '\0'; i++)
                putchar('0');
            puts("1");
            continue;
        }
        len = strlen(s);
        //特判只有一位数的情况
        if(len < 2)
        {
            s[0]++;
            puts(s);
            continue;
        }
        mid = len / 2;
        odd = len & 1;
        if(odd)
        {
            for(i = mid - 1, j = mid + 1; i > -1 && s[i] == s[j]; i--, j++){}
            //原数是回文数
            if(i == -1)
            {
                for(i = mid; s[i] == '9'; i++)
                    s[len - i - 1] = s[i] = '0';
                s[len - i - 1] = ++s[i];
                puts(s);
            }
            else if(s[i] > s[j])
            {
                for(i = 0; i < mid; i++)
                    putchar(s[i]);
                for(; i > -1; i--)
                    putchar(s[i]);
                puts("");
            }
            //s[i] < s[j]
            else
            {
                /*for loop中的判断条件不需要i > -1,因为必定能找到s[i] != '9'的i。试想如果
                s[i] == '9'一直成立,就不会有s[i] < s[j]了。*/
                for(i = mid; s[i] == '9'; i--)
                    s[i] = '0';
                s[i]++;
                for(i = 0; i < mid; i++)
                    putchar(s[i]);
                for(; i > -1; i--)
                    putchar(s[i]);
                puts("");
            }
        }
        //odd = false
        else
        {
            for(i = mid - 1, j = mid; i > -1 && s[i] == s[j]; i--, j++){}
            //原数是回文数
            if(i == -1)
            {
                /*此处for loop不需要i<len这一判断条件,因为此前已特判所有digit为9的情况,故
                必然存在i使得s[i]!='9'*/
                for(i = mid; s[i] == '9'; i++)
                    s[len - i - 1] = s[i] = '0';
                s[len - i - 1] = ++s[i];
                for(i = 0; i < len; i++)
                    putchar(s[i]);
                puts("");
            }
            else if(s[i] > s[j])
            {
                for(i = 0; i < mid; i++)
                    putchar(s[i]);
                for(i = mid - 1; i > -1; i--)
                    putchar(s[i]);
                puts("");
            }
            //s[i] < s[j]
            else
            {
                //必定存在i使得s[i]!='9',不然不会有s[i] < s[j](这是进入这个else的条件)
                for(i = mid - 1; s[i] == '9'; i--)
                    s[i] = '0';
                s[i]++;
                for(i = 0; i < mid; i++)
                    putchar(s[i]);
                for(i = mid - 1; i > -1; i--)
                    putchar(s[i]);
                puts("");
            }
        }
    }
}



### C语言实现计算回文数个数 为了计算给定范围内的回文数个数,可以编写一个函数来判断单个整数是否为回文数,并遍历指定范围内所有的整数来进行统计。下面是一个完整的解决方案。 #### 判断单个整数是否为回文数 定义辅助函数 `isPalindrome` 来检测某个整数 n 是否构成回文结构: ```c #include <stdbool.h> bool isPalindrome(int num) { if (num < 0) return false; // 负数不是回文数 int originalNum = num; long reversedNum = 0; while (num != 0) { int digit = num % 10; reversedNum = reversedNum * 10 + digit; num /= 10; } return originalNum == reversedNum; } ``` 此部分代码实现了基本的反转数字并比较原数值与翻转后的值是否相等的功能[^5]。 #### 统计特定区间内所有回文数的数量 接下来创建另一个函数用于枚举从最小到最大之间的每一个可能候选者,并调用上述方法验证它们是不是满足条件;最后累加符合条件的结果数目返回即可: ```c int countPalindromesInRange(int minVal, int maxVal){ int palindromeCount = 0; for (int i=minVal ;i<=maxVal;i++){ if(isPalindrome(i)){ ++palindromeCount; } } return palindromeCount; } ``` 这段程序通过循环迭代的方式检查[minVal,maxVal]闭区间的每一个整数,利用之前定义好的`isPalindrome()`来做判定操作,从而得出总的回文数量。 #### 主函数示例 这里给出一段简单的测试代码作为示范用途,它会打印出1至100之间存在的全部正向负向都一样的自然数(即所谓的“回文数”)及其总数目: ```c #include <stdio.h> #include <stdlib.h> // ... 上面两个函数声明 ... int main(){ printf("Finding palindromic numbers between 1 and 100:\n"); int result = countPalindromesInRange(1, 100); printf("Total number of palindromic numbers found: %d\n",result); system("pause"); return 0; } ``` 该段脚本展示了如何组合前面提到过的各个组件形成最终的应用场景实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值