Brian Warehouse

Some birds aren`t meant to be caged, their feathers are just too bright... ...
posts - 40, comments - 16, trackbacks - 0, articles - 1

回文数

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

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理