NC14412. 回文数
描述
输入描述
输入只有1行,输入一个整数n。数据保证:0≤n≤10100
输出描述
输出一行结果,表示不小于n的第一个回文数n1。
示例1
输入:
123
输出:
131
示例2
输入:
121
输出:
121
C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 504K, 提交时间: 2020-04-03 11:10:05
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define pb push_back #define inf 132913423039 typedef long long ll; const ll mod=1e9+7; const ll N=1e5+5; const double eps=1e-7; using namespace std; const int manx=55; ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);} ll lcm(ll a,ll b) { return a*b/gcd(a,b); } ll qp(ll a,ll b, ll p){ll ans = 1;while(b){if(b&1){ans = (ans*a)%p;--b;}a = (a*a)%p;b >>= 1;}return ans%p;} ll Inv(ll x) { return qp(x,mod-2,mod);} ll C(ll n,ll m){if (m>n) return 0;ll ans = 1;for (int i = 1; i <= m; ++i) ans=ans*Inv(i)%mod*(n-i+1)%mod;return ans%mod;} char a[105]; char b[105]; int main() { scanf("%s",a+1); int len=strlen(a+1); int g=1,i,pos1=0,pos2=0; if(len%2==1)//假如是奇数,肯定是构造1~len/2+1的回文串 { int flag=0; for(i=1;i<=len/2+1;i++) { b[g++]=a[i]; } for(i=len/2;i>=1;i--) { b[g++]=a[i]; }//构造一个回文串 for(i=len/2+1;i<=len;i++) { if(b[i]>a[i]) {flag=1;break;} if(b[i]<a[i]) break; }//判断满足不? if(flag||i==len+1) printf("%s\n",b+1);//假如满足就直接输出 else { //从中间开始往上遍历找到第一个不为9的数->+1 for(i=len/2+1;i>=1;i--) { if(b[i]!='9') { if(i!=len/2+1) {b[i]++;}b[len-i+1]++; pos1=i,pos2=len-i+1;break; } } for(i=pos1+1;i<=pos2-1;i++) b[i]='0'; printf("%s\n",b+1); } } else//假如为偶数串..那我就构造1~len/2的回文串,基本和上面差不多了复制一下就好了 { int flag=0; for(i=1;i<=len/2;i++) { b[g++]=a[i]; } for(i=len/2;i>=1;i--) { b[g++]=a[i]; }//构造一个回文串 for(i=len/2+1;i<=len;i++) { if(b[i]>a[i]) {flag=1;break;} if(b[i]<a[i]) break; }//判断满足不? if(flag||i==len+1) printf("%s\n",b+1);//假如满足就直接输出 else { //从中间开始往上遍历找到第一个不为9的数->+1 for(int i=len/2;i>=1;i--) { if(b[i]!='9') { pos1=i,pos2=len-i+1; b[i]++;b[len-i+1]++;break; } } for(i=pos1+1;i<=pos2-1;i++) b[i]='0'; printf("%s\n",b+1); } } return 0; } /* 1998 */
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 412K, 提交时间: 2022-08-25 21:28:31
#include <bits/stdc++.h> const int maxn=205; const int maxm=2e6+10; const int inf=1e9+10; char s[maxn]; int main(){ scanf("%s",&s); int len=strlen(s); bool flag=1; for(int i=0,j=len-1;i<=j;i++,j--){ if(s[i]!=s[j]){ flag=0;break; } } if(flag){ printf("%s",s); return 0; } flag=0; if(len&1){ for(int i=len/2,j=len/2;i>=0;i--,j++){ if(s[i]>s[j]){ flag=1; } s[j]=s[i]; } if(!flag){ int now=0,yu=1; for(int i=len/2;i>=0;i--){ now=(s[i]-'0'+yu); yu=now/10;now=now%10; s[i]=now+'0'; } for(int i=len/2,j=len/2;i>=0;i--,j++){ s[j]=s[i]; } if(yu){ printf("1%s1",s); } else{ printf("%s",s); } } else{ printf("%s",s); } } else{ for(int i=len/2-1,j=len/2;i>=0;i--,j++){ if(s[i]>s[j]){ flag=1; } s[j]=s[i]; } if(!flag){ int now=0,yu=1; for(int i=len/2-1;i>=0;i--){ now=(s[i]-'0'+yu); yu=now/10;now=now%10; s[i]=now+'0'; } for(int i=len/2-1,j=len/2;i>=0;i--,j++){ s[j]=s[i]; } if(yu){ printf("1%s1",s); } else{ printf("%s",s); } } else{ printf("%s",s); } } return 0; }