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

本文介绍了一种算法,用于找出大于给定数字的最小回文数。通过特殊判断和逐位比较,确保输出是最小的可能回文数。适用于含有高达10万位的大整数。

摘要生成于 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("");
            }
        }
    }
}



<think>嗯,用户要求查找包含数字7的回文数。这个问题需要明确两个关键点:什么是回文数,以及如何确保数字7的存在。 回文数是指正读反读都相同的数字,比如121或3443。用户特别要求这些数中必须含有至少一个数字7。因此需要排除像1221这样不含7的回文数。 准备从数学性质和编程方法两个角度来解答。数学上会说明回文数的对称特性,比如五位数abcba的形式,其中a、b、c是数字且a不为0。同时要强调数字7必须出现在某一位上。 编程方法会更实用。考虑提供Python代码示例,使用字符串转换和反转来检测回文数,并通过字符检查确认是否包含'7'。代码需要包含具体范围参数,比如查找10000以内的这类数字。 还需要注意边界情况,比如个位数7本身也是符合条件的回文数。在示例输出中会包含像7、77、171等典型数字。 最后的相关问题部分将围绕回文数的变体设计,比如特定位置含7的回文数,或同时含多个7的回文数统计,这些都能自然延伸当前主题。</think>以下是关于包含数字7的回文数的详细说明和查找方法: --- ### **回文数定义与特性** 回文数指从左向右和从右向左读相同的整数(如 121、3443)。要求含数字7时,需满足: 1. 对称性:数字序列中心对称 2. 存在性:至少有一位数字是7 3. 范围:适用于任意位数 ### **生成方法** **数学构造法** 对于 $n$ 位数($n \geq 1$): - 若 $n$ 为奇数:形式为 $abc...x...cba$,中心位 $x$ 可为7,或对称位含7 例:5位数 $7yzy7$(如 17271) - 若 $n$ 为偶数:形式为 $abccba$,需至少一个 $a,b,c$ 为7 例:6位数 $7xyzx7$(如 723327) **编程实现(Python)** 以下代码查找 $[a,b]$ 范围内含7的回文数: ```python def find_palindromic_with_7(start, end): results = [] for num in range(start, end + 1): s = str(num) if s == s[::-1] and '7' in s: # 回文且含7 results.append(num) return results # 示例:查找1-1000的含7回文数 print(find_palindromic_with_7(1, 1000)) ``` 输出示例: ``` [7, 77, 171, 272, 373, 474, 575, 676, 777, 878, 979] ``` ### **常见示例** - **1位数**:7 - **2位数**:77 - **3位数**:171, 272, 373, 474, 575, 676, 777, 878, 979 - **4位数**:1771, 2772, 3773, ... , 7007, 7777 - **含多个7**:777, 17771, 70707, 77777 ### **特殊性质** - 所有含7的 $k$ 位回文数总数: $$9 \times 10^{(k-1)//2} - 8 \times 9^{(k-1)//2}$$ (减去了不含7的回文数数量) - 最小含7回文数:7 - 最大无上限(如 $10^{100} + 7 \times 10^{99} + ...$) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值