Posted on 2010-08-17 13:48
Brian 阅读(858)
评论(0) 编辑 收藏 引用 所属分类:
一些好题
好几个人问我校内OJ的回文数那道题,我去年没做,现在看了,怪不错的一道题:
Description
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。例如121就是一个回文数。
对于任意一个数,可以进行如下变换,可以得到一个回文数。
例如:
给定一个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,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
Input
第一行为N
第二行为M
Output
STEP=步数
或
Impossible!
Sample Input
9
87
Sample Output
STEP=6
#include<stdio.h>
#include<string.h>
char M[20];
int N,len;// 进制、字符串长度
int a[20]={0},b[20]={0};
void Format(char a[],int b[])
{
int i=0;
for (; i<len; i++)
if(N>10 && a[i]>='A')
b[i]=a[i]-'A'+10;
else b[i]=a[i]-'0';
}
void Step()
{
int i=0;
a[len]=0;
for (; i<len; i++)
b[i]=a[len-i-1];
for (i=0; i<len; i++) //核心代码
{
a[i]+=b[i];
if (a[i]>N-1)
{
a[i+1]+=a[i]/N;
a[i]=a[i]%N;
}
}
if(a[len]) len++;
}
int IsPalindrome() //判断是否是回文数
{
int i=0;
for (; i<=len/2; i++)
if (a[i]!=a[len-1-i])
return 0;
return 1;
}
int main()
{
int STEPS=0;
scanf("%d",&N);
scanf("%s",M);
len=strlen(M);
Format(M,a); //将字符转化为对应进制数字
while(1)
{
if(STEPS>30)
{
printf("Impossible!\n");
return 0;
}
if(STEPS && IsPalindrome())
break;
Step();
STEPS++;
}
printf("STEP=%d\n",STEPS);
return 0;
}
我的是任意进制都可以的, 192MS 0K