生成回文数

Description

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。 
例如:给定一个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

步数

Sample Input

10 87

Sample Output

4

Hint

输入的N进制数M,其位数不超出6位

Source

NOIP1999第五届全国青少年信息学奥林匹克分区联赛普及组复赛第二题

#include
using namespace std;
char s[1001];
int a[10100],b[10100],step=0,n,m,len=0;
bool pd()
{
	int y=1;
	for(int i=0;i<=(len+1)/2;i++)
		if(a[i]!=a[len-i-1]) y=0;
	return y;
}
void add()
{
	int k=len;
	for(int i=0;i=n)
		{
            a[i]-=n;
            a[i+1]++;
            if(a[len]!=0)len++;
        }
    }
	
}
int main()
{
	cin>>n;
	cin>>s;
	int j=0;
	for(int i=strlen(s)-1;i>=0;i--)
	{
        if(s[i]>='0'&&s[i]<='9')//是数字 
		{
            a[j++]=s[i]-'0';
            len++;
        }
	}
	for(int i=len-1;i>=0;i--)
	{
        b[len-i-1]=a[i];
    }
    while(!pd() && step<=30)
	{
        add();
        step++;
    }
    if(step<=30)printf("%d",step);
      else printf("Impossible!");
	return 0;
 } 

你可能感兴趣的:(NOIP)