题目 1161:
回文数(二)
时间限制: 1Sec 内存限制: 128MB 提交: 2065 解决: 875
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个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<=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入格式
共两行
第一行为进制数N(2<=N<=16)
第二行为N进制数M(0<=M<=maxlongint)
输出格式
共一行,为“STEP=经过的步数”或“Impossible!”
样例输入
复制
9 87
样例输出
复制
STEP=6
代码:
#include<iostream>
#include<cstring>
using namespace std;
int n;
char os[100];
void sub()
{
int t=0;
char tem[1000];
int k=0;
for(int i=0,j=strlen(os)-1;i<strlen(os);i++,j--)
{
int m=(os[i]-'0')+(+os[j]-'0')+t;
t=m/n;
tem[k++]=(m%n)+'0';
}
while(t)
{
tem[k++]=t%n+'0';
t=t/n;
}
strcpy(os,tem);
}
int main()
{
scanf("%d %s",&n,os);
int step=0;
while(1)
{
step++;
if(step>30)
{
puts("Impossible");
break;
}
sub();
int flag=1;
for(int i=0,j=strlen(os)-1;j>i;i++,j--)
{
if(os[i]!=os[j])flag=-1;
}
if(flag==1)
{
printf("STEP=%d\n",step);
break;
}
}
return 0;
}