洛谷——P1609 最小回文数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷——P1609 最小回文数相关的知识,希望对你有一定的参考价值。

题目描述

回文数是从左向右读和从右向左读结果一样的数字串。

例如:121、44 和3是回文数,175和36不是。

对于一个给定的N,请你寻找一个回文数P,满足P>N。

满足这样条件的回文数很多,你的任务是输出其中最小的一个。

输入输出格式

输入格式:

 

1行,一个正整数N。N的数值小于10^100,并且N没有前导0。

 

输出格式:

 

你的程序应该输出一行,最小的回文数P(P>N)。

 

输入输出样例

输入样例#1: 复制
44
输出样例#1: 复制
55

说明

50%的数据,N<10^9

100%的数据,N<10^100

 

40分模拟

技术分享图片
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 110
using namespace std;
char ch[N];int l;
int main()
{
    cin>>ch+1;ch[0]=0;
    l=strlen(ch+1);
    if(l%2==0)
    {
        for(int i=l/2;i>=1;i--)
        {
            if(ch[i]>9) 
             ch[i-1]+=(ch[i]-0)/10,ch[i]=(ch[i]-0)%10+0;
            else 
            {
                if(ch[i]==9) ch[i]=0,ch[i-1]+=1;
                else break;
            }
        }
        if(ch[0]!=0)
        {
            for(int i=1;i<=l+1;i++)
             printf("1");
            return 0;
        }
        for(int i=1;i<=l/2;i++)
         printf("%c",ch[i]);
        for(int i=l/2;i>=1;i--)
         printf("%c",ch[i]);
    }
    else
    {
        if(ch[l/2+1]!=9) ch[l/2+1]+=1;
        else
        {
            ch[l/2+1]=0;ch[l/2]+=1;
            for(int i=l/2;i>=1;i--)
            {
                if(ch[i]>9) 
                 ch[i-1]+=(ch[i]-0)/10,ch[i]=(ch[i]-0)%10+0;
                else break;
            }
        }
        if(ch[0]!=0)
        {
            for(int i=1;i<=l+1;i++)
             printf("1");
            return 0;
        }
        for(int i=1;i<=l/2;i++)
         printf("%c",ch[i]);
        printf("%c",ch[l/2+1]);
        for(int i=l/2;i>=1;i--)
         printf("%c",ch[i]);
    }
    return  0;
}
40分模拟

 

题解

技术分享图片
var
  s,s1:string;
  i,len:longint;
begin
  readln(s);
  len:=length(s);
  s1:=s;
  for i:=1 to len div 2 do
    s1[len-i+1]:=s[i];
  if s1>s then begin write(s1); halt; end;
  i:=(len+1) div 2;
  while (s[i]=9) and (i>0) do dec(i);
  if i=0 then begin write(1); for i:=1 to len-1 do write(0); write(1); halt; end
         else begin inc(s[i]); for i:=i+1 to (len+1) div 2 do s[i]:=0; end;
  for i:=1 to len div 2 do
    s[len-i+1]:=s[i];
  write(s);
end.
View Code

 

以上是关于洛谷——P1609 最小回文数的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 U3348 A2-回文数

洛谷 U3348 A2-回文数

洛谷 P1015 回文数

洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes

洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes

洛谷P1207 [USACO1.2]双重回文数 Dual Palindromes