1. 程式人生 > >Vijos訓練計劃 1304回文數

Vijos訓練計劃 1304回文數

限制 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>
 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 }
View Code

因為沒加“=”而wa巨多次

因為impossible的I沒有大寫而wa

題是水題 但細心才能對啊...

Vijos訓練計劃 1304回文數