对于一个自然数n,若将n的各位数字反向排列所得的数n1与n相等,则称n为回文数,例如2332。
若给定一个N( 2<=N<=16)进制数M(M的长度在一百位以内),如果M不是回文数,可以对其进行N进制加法,最终得到回文数。
例如对于十进制数79 STEP1 : 79 + 97 = 176 STEP2 : 176 + 671 = 847 STEP3 : 847 + 748 = 1595 STEP4 : 1595 +5951 = 7546 STEP5 : 7546 + 6457 = 14003 STEP6 : 14003 + 30041 = 44044
那么对于给定的N进制数M,请判断其能否在30步以内(包括30步)得到回文数。
输入格式
第一行包括一个正整数 N(2<=N<=16)。
第二行包括一个正整数M(一百位以内)。
输出格式
如果可以在n步内得到回文数,输出“STEP=n”,否则输出“NO”。
输入样例1
10
79
输出样例1
STEP=6
输入样例2
8
665556
输出样例2
NO
注解:不同进制,在进位时要除或者取余相应的数
获取反转数的时候也是要乘以相应的数字
例如 八进制进位时:该位置要除八得到进位数;取余八得到当前位的数字;
反转时当前数字乘以八再加上后一个数字(后一个数字为当前数字的个位)
反转原理:将需要反转的数字不断取到其个位上的数字,乘以相应的进制数加上其十位上的数字,再抹去个位,使得十位变个位,不断循环最后得到反转数字;
这边加法运算可以运动大数加法的思想;
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
unsigned long long reverse=0,k,len,nex;
string hws;
bool judge(unsigned long long reverse)
{
unsigned long long reverse1 = 0;
for(unsigned long long i = reverse;i;i/=k)
{
reverse1=reverse1*k+i%k;
}
nex = reverse1 + reverse;
return reverse==reverse1;
}
unsigned long long change(char a)
{
if(a>='0'&&a<='9')return a-'0';
return a-'A'+10;
}
int main(){
unsigned long long step;
scanf("%lld",&k);
cin>>hws;
unsigned long long len = ();
for(int i = 0;i<len;i++)
{
reverse = reverse*k+change(hws[i]);
}
for(step = 0;step<=30&&!judge(reverse);step++)
{
reverse = nex;
}
if(step<=30)
{
printf("STEP=%d",step);
}else
{
printf("No");
}
}