c语言 csuoj 找到大于给定数字的最小回文数

/*建议复制到编译器打开 方便观看

思路分析:考虑给定数字的中左数(中间偏左第一个数)和中右数的大小情况

1.若中左大于中右,则可直接打印中左,中间数(若为偶数则无需打印),中左倒序数

2.若中左小于等于中右,则对中数(数位为奇)(或中左(数位为偶))进行++操作

若++后大于9 则原来中左等于中右等于9,或中数等于9,赋值0,接着对中左或中数的前一位数进行相同操作,直到找到一个<=8的数字,进行++操作后即可跳至打印操作*/


# include<stdio.h>
# include<string.h>

int main() {
    char a[10005];
    while (~scanf("%s", a)) {
        int len = strlen(a);
        int flag = 0;//初始变量声明,flag默认为0,便于下面合并中左<=中右的情况
        for (int i = len / 2 - 1; i >= 0; i--) {
            if (a[i] > a[len - i - 1]) {
                flag = 1;
                break;
            } else if (a[i] < a[len - i - 1]) {
                flag = 0;
                break;
            }//判断中左与中右
        }
        if (!flag) {//若中左小于等于中右
            for (int i = (len - 1) / 2; i >= 0; i--) {
                a[i]++;
                if (a[i] > '9')
                    a[i] = '0';
                else
                    break;
            }//处理中左或其左边为9需进位的情况
            if (a[0] == '0') {
                a[0] = '1';
                len++;//扩位为打印做准备
                a[len / 2] = '0';
            }//若首位为0 则原中左至首位皆为9,仅需打印1000..1 确定位数即可
        }
        for (int i = 0; i < len / 2; i++)
            printf("%c", a[i]);//打印首位至中左的所有字符
        for (int i = (len + 1) / 2 - 1; i >= 0; i--)
            printf("%c", a[i]);//倒序 从中或中右往回打
        printf("\n");
    }

    return 0;
}

总结:考虑相邻的回文数时,从中左,中,中右三个位置入手

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值