1. 程式人生 > >生成迴文數

生成迴文數

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<bits/stdc++.h>
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<len;i++)
	    b[i]=a[len-i-1];
	for(int i=0;i<len;i++)
	    a[i]+=b[i];
	for(int i=0;i<len;i++)
	{
        if(a[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;
 }