1999普及组-回文数
链接:https://www.nowcoder.com/acm/contest/153/1074
来源:牛客网
来源:牛客网
1999普及组-回文数
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加56(即把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,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入描述:
两行,分别是N,M。
输出描述:
STEP=ans(ans表示答案)
#include <stdio.h>
#include <string.h>
intN,a[500],b[500],step=0;
chars[500];
voidadd(inta[],intb[])
{
inti;
for(i=1;i<=a[0];i++)
{
a[i]+=b[i];
a[i+1]+=a[i]/N;
a[i]%=N;
}
if(a[a[0]+1]>0)a[0]+=1;
}
intjudge(inta[])
{
inti;
for(i=1;i<=a[0]/2;i++)
if(a[i]!=a[a[0]-i+1])
return0;
return1;
}
voidoverturn(inta[])
{
inti,j=0;
b[0]=a[0];
for(i=a[0];i>=1;i--)
b[++j]=a[i];
}
voidprint(inta[])
{
inti;
for(i=a[0];i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
intmain()
{
intlen,i,k=0;
scanf("%d%s",&N,s);
len=strlen(s);
for(i=len-1;i>=0;i--)
if('0'<=s[i]&&s[i]<='9')
a[++k]=s[i]-'0';
elseif('a'<=s[i]&&s[i]<='z')
a[++k]=s[i]-'a'+10;
elseif('A'<=s[i]&&s[i]<='Z')
a[++k]=s[i]-'A'+10;
a[0]=len;
while(judge(a)==0)
{
overturn(a);
add(a,b);
step++;
if(step==31)break;
}
if(step==31)
printf("Impossible!");
elseprintf("STEP=%d",step);
return0;
}