迴文數

題目描述

若一個數(首位不爲零)從左向右讀與從右向左讀都一樣,我們就將其稱之爲迴文數。

例如:給定一個十進制數 565656 ,將 565656656565 (即把 565656 從右向左讀),得到 121121121 是一個迴文數。

又如:對於十進制數 878787

STEP1: 878787 + 787878 = 165165165
STEP2: 165165165 + 561561561 = 726726726
STEP3: 726726726 + 627627627 = 135313531353
STEP4: 135313531353 + 353135313531 = 488448844884

在這裏的一步是指進行了一次 NNN 進制的加法,上例最少用了 444 步得到迴文數 488448844884

寫一個程序,給定一個 NNN ( 2≤N≤10,N=162 \le N \le 10,N=162N10,N=16 )進制數 MMM ( 100100100 位之內),求最少經過幾步可以得到迴文數。如果在 303030 步以內(包含 303030 步)不可能得到迴文數,則輸出Impossible!

輸入輸出格式

輸入格式:

兩行,分別是 NM
輸出格式:

STEP=ans

輸入輸出樣例

輸入樣例#1:複製
10
87
輸出樣例#1:複製
STEP=4

標程:

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
unsigned long long n=0,k,len,nex;
string nn;
bool wow(unsigned long long a)//把數倒過來,再相加
{
    unsigned long long s=0;
    for (unsigned long long i=a;i;i/=k)
        s=s*k+i%k;//值得學習
    nex=s+a;
    return s==a;
}//如果s==a返回真,否則爲假。新用法
unsigned long long ch(char a)
{
    if (a>='0' && a<='9') return a-'0';
    return a-'A'+10;
}
int main()
{
    cin>>k>>nn;len=nn.size();
    for (int i=0;i<len;i++)
        n=n*k+ch(nn[i]);//轉成數字
    unsigned long long step;
    for (step=0;!wow(n) && step<=30;step++)//!wow()就是s!=a;
        n=nex;
    if (step<=30) cout<<"STEP="<<step<<endl;
    else cout<<"Impossible!";
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章