Vijos訓練計劃 1304回文數
阿新 • • 發佈:2018-03-05
限制 lap stdlib.h num copy ide ace font long
描述
若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。
例如:給定一個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
Copy
樣例輸出1
STEP=6
Copy
限制
各個測試點1s
來源
NOIP1999提高組第2題
1 #include <iostream> 2 #include <string.h> 3View Code#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
題是水題 但細心才能對啊...
Vijos訓練計劃 1304回文數