洛谷 CF863A Quasi-palindrome

problem

给你一个小于等于\(10^{9}\)的数,问你能不能在这个数的前加前导\(0\),是这个数变成回文数。能则输出YES,否则输出NO

thinking

主要思路:判断回文数

我们可以把题目中的加前导\(0\)替换成删除末尾的\(0\)
证明:

  • 如果末尾没有\(0\)且这个数原来不是回文数,那么你前面不管怎么加\(0\)都不会成回文数;
  • 如果末尾有\(0\),则你可以通过删除末尾所有\(0\)来达到加前导\(0\)的效果。
    (对“所有”的解释:不删除末尾所有的\(0\),此数肯定不是回文数,因为自然数是没有前导\(0\)的)

拿样例举例:

131

这个数本来就是回文数,所以直接输出\(YES\)

320

首先先判断这个数是不是回文数,发现不是,则删除末尾所有的\(0\),原数变为\(32\),再判断是否为回文数,发现不是,则输出\(NO\)

2010200

首先先判断这个数是不是回文数,发现不是,则删除末尾所有的\(0\),原数变为\(20102\),再判断是否为回文数,发现是回文数,则输出\(YES\)

program

献上丑码代码

var
 n:string;
function hws(n:string):string;
 var
  i:longint;
 begin
  for i:=1 to length(n) div 2 do if n[length(n)-i+1]<>n[i] then exit('NO');
  exit('YES');
 end;//判断是否为回文数
begin
 readln(n);
 while n[length(n)]='0' do delete(n,length(n),1);//删除所有的末尾0
 write(hws(n));
end.
posted @ 2020-08-13 17:15  离线中……  阅读(134)  评论(0编辑  收藏  举报