7.9 字符串-最小的回文数
今天为大家讲述一道字符串的题目,重在理解思路,找到对应的某个值,如果挨个枚举时间复杂度过高,
而对字符串进行修改,灵活性会相应的高许多
题目描述
回文数是从前往后和从后往前得到的数是相同的。
现给你一个正整数N,请你找到比N大的最小的那个回文数P。
现给你一个正整数N,请你找到比N大的最小的那个回文数P。
输入
输入包含多组测试数据。
每组输入一个正整数N,N不超过10000位,并且N不包含前导0。
每组输入一个正整数N,N不超过10000位,并且N不包含前导0。
输出
对于每组输入,输出比N大的最小的那个回文数P。
样例输入 Copy
44
3
175
181
题解代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
string a;
while(cin>>a){
int len=a.size();
int 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]){
break;
}
}
if(!flag){
for(int i=(len-1)/2;i>=0;i--){
a[i]++;
if(a[i]>'9'){
a[i]='0';
}
else break;
}
}
if(a[0]=='0'){
a[0]='1';
len++;
a[len/2]='0';
}
for(int i=0;i<len/2;i++){
printf("%c",a[i]);
}
for(int i=(len-1)/2;i>=0;i--){
printf("%c",a[i]);
}
printf("\n");
}
}
题解思路:
这道题的思路是将该数分为前半部分和后半部分进行比较,具体比较方法为将前半部分从后往前的每一位与后半部分从前往后的每一位进行比较,即定义指针i从len/2-1到0,
a[i]与a[len-i-1]进行比较
定义一个bool型的flag变量
比较分为三种情况:
1.若a[i]>a[len-i-1],则flag=1,跳出循环
2.若a[i]==a[len-i-1],直接continue跳入循环下一阶段
3.若a[i]<a[len-i-1],直接跳出循环
最后判断flag的值,
1.若flag==1,说明后半部分比前半部分小,不进行操作
2.flag==0时,后半部分比前半部分大,需对前半部分的数进行进位操作,用for循环从i从(len-1)/2到0,对a[i]进位,若a[i]++比9大,a[i]赋值为'0',
进入下一循环,知道循环结束或碰到第一个a[i]++后小于等于'9'的数
在最后输出前需判断一种特殊情况,即全为'9'组成的数,例如9999,需输出10001,在上述操作中,9999前半部分会背赋值为00,这时需将a[0]赋值为'1',
字符串长度len+1,将中位数a[len/2]赋值为0.
最后将a数组前半部分从前往后输出一遍,再从后往前输出一遍即为正确答案。