練習賽6.1.迴文數

迴文數

Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 37 Accepted Submission(s) : 11

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

若一個數(首位不爲零)從左向右讀與從右向左讀都是一樣,我們就將其稱之爲迴文數。例如:給定一個 10進制數 56,將 56加 65(即把56從右向左讀),得到 121是一個迴文數。又如,對於10進制數87, STEPl: 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

輸入有多組數據,每組數據有兩個數分別爲進制數M和數N。

Output

求最少經過幾步可以得到迴文數。如果在30步以內(包含30步)不可能得到迴文數,則輸出“Impossible”

Sample Input

10 87

Sample Output

4
思路分析:這個題目因爲首先要把輸入的字符轉化成數字,然後檢查是不是迴文數,如果不是就把它進行處理。把它進行相加處理,然後又點細節處理就是把a【0】做爲記數的個數。
代碼:
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int ans,n,a[101],b[101],i;
string s;
void zhuanhuan()
{
    memset(a,0,sizeof(a));
    a[0]=s.length();
    for(i=1;i<=a[0];i++)
        if(s[a[0]-i]>='0'&&s[a[0]-i]<='9') a[i]=s[a[0]-i]-'0';
    else a[i]=s[a[0]-i]-'A'+10;
}
bool check()
{
    for(i=1;i<=a[0];i++)
        if(a[i]!=a[a[0]-i+1]) return false;
  return true;
}
void jia()
{
    for(i=1;i<=a[0];i++) b[i]=a[a[0]-i+1];
    for(i=1;i<=a[0];i++) a[i]+=b[i];
    for(i=1;i<=a[0];i++) {a[i+1]+=a[i]/n;a[i]%=n;}//第二次還是沒有寫加號所以開始又錯了,因爲有本來位還有數字所以要相加。
    if(a[a[0]+1]>0) a[0]++;
}
int main()
{
    while(cin>>n>>s)
    {
        zhuanhuan();
    if(check()) {cout<<0<<endl;continue;}
    ans=0;
    while(ans++<=30)
    {
        jia();
        if(check()) {cout<<ans<<endl;break;}
    }
    if(ans>30)
    cout<<"Impossible"<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章