趣味程序设计_求对称数

该博客介绍了如何编程寻找大于指定对称数的下一个对称数。对称数是指从左向右读和从右向左读都相同的数字。博客提供输入输出描述,并给出样例输入和输出。
摘要由CSDN通过智能技术生成

题目描述

如果给定一个对称数n,请你求出大于n的最小对称数(即这个数从左向右读和从右向左读是完全一样的)。

输入

第一行输入t(0<t<19999);

接下来的t行,每行输入一个n(0<n<10^9)。

输出

与输入相对应,每行输出一个大于n的最小对称数m。

样例输入

6
1
11
99
789987
123454321
999999999

样例输出

2
22
101
790097
123464321
1000000001
思路:求一个回文数的下一个最下回文数
1.数据的输入用字符数组,便于处理每一位数字。
2.对数据的位数分奇数偶数处理
奇数:取一半加中间数。
偶数:取一半。

然后对取的数+1,再进行输出,输出的时候注意特殊数据
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
char s[500];
int str[500],mid,num,output[500];
int  judge(int r)    //判断是否进位例:99+1=100或999+1=1000
{   int inum=0,i=0,result=r;
    while(r!=0)
    {
        r/=10;
        inum++;
    }
    if(num%2!=0)
     return inum>mid+1?1:0;
     else
    return inum>mid?1:0;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {   int sum;
        scanf("%s",s);
         num=strlen(s);
        for(int i=0;i<strlen(s);i++)
            {
                str[i]=s[i]-'0';
                sum=sum*10+str[i];
            }
            //转换数组
        mid=num/2;
        int left=0;
        if(num%2==0)
        for(int i=0;i<mid;i++)
            left=left*10+str[i];
         else
            for(int i=0;i<=mid;i++)
             left=left*10+str[i];
            //算出取一半的数构造回文数 
        int r=left+1,result=r,j=0;//算出一半+1
    while(r!=0)
    {
        output[j++]=r%10;
        r/=10;
    }
 
   if(num==1&&sum!=9)    //特殊数据的处理1--8
      printf("%d",str[0]+1);
  else if(sum==11)      //特殊数据的处理11
       printf("22");
  else  if(sum==9)     //特殊数据的处理9
        printf("10");
   else  if(num%2==1){  //处理位数是奇位数的数据
       if(judge(result))   
       {  printf("%d",result/10);
           for(int i=1;i!=j;i++)
            printf("%d",output[i]);
 
       }
       else {
            printf("%d",result);
          for(int i=1;i!=j;i++)
            printf("%d",output[i]);
 
       }
       }
   else{   //处理位数是偶位数的数据
           if(judge(result)){
                printf("%d",result);
             for(int i=1;i!=j;i++)
               printf("%d",output[i]);
       }
       else{printf("%d",result);
        for(int i=0;i!=j;i++)
          printf("%d",output[i]);
       }
       }
       printf("\n");
    }
   
}

 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值