第二部分 基礎算法 -- 第一章 高精度計算1309:【例1.6】迴文數(Noip1999)

1309:【例1.6】迴文數(Noip1999)

時間限制: 1000 ms 內存限制: 65536 KB
提交數: 7593 通過數: 2873
【題目描述】
若一個數(首位不爲零)從左向右讀與從右向左讀都是一樣,我們就將其稱之爲迴文數。例如:給定一個 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” 。

【輸入】
給定一個N(2<N<=10或N=16)進制數M。

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

【輸入樣例】
9 87
【輸出樣例】
6


思路:本題按照題目意思模擬即可。16進制位要專門判斷。

#include<iostream>
#include<cstring>
#define N 310
using namespace std;
int a[N],lena;
bool hw(){//迴文數函數
    for(int i=0;i<=lena/2;i++)
        if(a[i]!=a[lena-i-1])return false;
    return true;
}
int main(){
    int n;
    string m;
    cin>>n>>m;
    lena=m.size();
    for(int i=0;i<lena;i++)//讀取字符串並逆序轉換爲數組 
    {
        if(m[i]>='0'&&m[i]<='9')a[i]=m[lena-i-1]-'0';
        else a[i]=(m[lena-i-1]-'A')+10;
    }
    if(hw()==true){cout<<0<<endl;return 0;}
    for(int i=1;i<=30;i++){//加法運算
        for(int j=0;j<=lena/2;j++)a[j]+=a[lena-j-1];
        for(int j=lena/2;j<lena;j++)a[j]=a[lena-j-1];
        for(int j=0;j<lena;j++)
        {
            if(a[j]>=n){
                a[j+1]++;
                a[j]-=n;
                if(j==lena-1)lena++;
            }
        }
        if(hw()){
            cout<<i<<endl;
            return 0;
        }
    }
    cout<<"Impossible\n";
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章