描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个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,其中16进制数字为0-9与A-F,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
格式
输入格式
共两行
第一行为进制数N(2<=N<=10或N=16)
第二行为N进制数M(0<=M<=maxlongint)
输出格式
共一行
第一行为“STEP=”加上经过的步数或“Impossible!”
样例1
样例输入1
9
87
样例输出1
STEP=6
限制
各个测试点1s
来源
NOIP1999提高组第2题
1 #include <iostream> 2 #include <string.h> 3 #include <math.h> 4 #include <cstdio> 5 #include <stdlib.h> 6 7 using namespace std; 8 9 int main() 10 { 11 int n;//n进制数 12 char m[40]; 13 int m_n[40]={0},m_rev[40]={0}; 14 cin>>n>>m; 15 int l=strlen(m); 16 for(int i=l-1;i>=0;i--) 17 { 18 if(m[i]<=‘9‘&&m[i]>=‘0‘) 19 m_n[i]=m[i]-‘0‘; 20 else 21 m_n[i]=m[i]-‘A‘+10; 22 } 23 int flag=1; 24 for(int i=0;i<=l/2;i++) 25 if(m_n[i]!=m_n[l-i-1]) 26 { 27 flag=0; 28 break; 29 } 30 if(flag==1) 31 { 32 cout<<"STEP=0"<<endl; 33 return 0; 34 } 35 int step=0; 36 while(1) 37 { 38 for(int i=l-1;i>=0;i--) 39 m_rev[i]=m_n[l-i-1]; 40 int l0=l; 41 for(int i=0;i<=l0-1;i++) 42 { 43 m_n[i]+=m_rev[i]; 44 while(m_n[i]>=n) 45 { 46 m_n[i]-=n; 47 m_n[i+1]++; 48 if(i==l-1) 49 l++; 50 } 51 } 52 step++; 53 int flag=1; 54 for(int i=0;i<=l/2;i++) 55 if(m_n[i]!=m_n[l-i-1]) 56 { 57 flag=0; 58 break; 59 } 60 if(flag==0&&step>30) 61 { 62 cout<<"Impossible!"<<endl; 63 break; 64 } 65 else if(flag==1) 66 { 67 printf("STEP=%d\n",step); 68 break; 69 } 70 } 71 return 0; 72 }
因为没加“=”而wa巨多次
因为impossible的I没有大写而wa
题是水题 但细心才能对啊...