洛谷 P1015 回文数
Posted EvilEC 笑面
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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; } } }
以上是关于洛谷 P1015 回文数的主要内容,如果未能解决你的问题,请参考以下文章