洛谷 P1015 回文数
- 标签 字符串 模拟 NOIp普及组 1999 云端
- 难度 普及-
- 时空限制 1s / 128MB
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10,N=16)进制数M(100位之内),求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入输出格式
输入格式:
两行,分别是N,M。
输出格式:
STEP=ans
输入输出样例
输入样例#1:
10 87
输出样例#1:
STEP=4
#include<iostream> #include<cstring> #include<cstdio> #define N 100000 using namespace std; int a[N],b[N],h,n; string m; bool flag=true; bool judge() { if(flag) { for(int i=1;i<=h/2;i++) if(a[i]!=a[h-i+1]) return false; return true; } else { for(int i=1;i<=h/2;i++) if(b[i]!=b[h-i+1]) return false; return true; } } int main() { cin>>n>>m; h=m.length(); for(int i=1;i<=h;i++) { int o=m[i-1]-'0'; if(o<=9)a[i]=o; else a[i]=o-7; } int t=0; while(true) { if(flag) { for(int i=1;i<=h;i++) { b[i]+=a[i]+a[h+1-i]; if(b[i]>=n) { b[i+1]+=b[i]/n; b[i]=b[i]%n; } } memset(a,0,sizeof(a)); if(b[h+1])h++; flag=!flag; } else { for(int i=1;i<=h;i++) { a[i]+=b[i]+b[h+1-i]; if(a[i]>=n) { a[i+1]+=a[i]/n; a[i]=a[i]%n; } } memset(b,0,sizeof(b)); if(a[h+1])h++; flag=!flag; } t++; if(judge()) { cout<<"STEP="<<t; return 0; } else if(t==30) { cout<<"Impossible!"; return 0; } } }
年年岁岁花相似,岁岁年年人不同。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!