luogu P1015 迴文數

題目描述:
若一個數(首位不爲零)從左向右讀與從右向左讀都同樣,咱們就將其稱之爲迴文數。
例如:給定一個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(100位以內),求最少通過幾步能夠獲得迴文數。若是在30步之內(包含30步)不可能獲得迴文數,則輸出「Impossible!」c++

輸入格式:
兩行,分別是N,M。數組

輸出格式:
STEP=ansmarkdown

輸入樣例:
10
87
輸出樣例:
STEP=4函數

難度:簡單ui


這道題主要考查兩點:reverse和check。
將數存成數組的形式(也就是高精度的寫法),reverse就很好寫(swap一下)。this

源代碼以下:spa

/* About: luogu_P1015_迴文數 Auther: kongse_qi Date:2017/04/21 */
#include <bits/stdc++.h>
#define maxn 10005
using namespace std;

int Base, times;
string n;

struct qi
{
    int len, s[maxn], base;
    qi ()//初始化結構體
    {
        memset(s, 0, sizeof s);
        len = 0;
        base = Base;
    }
    qi (string a, int b)//也是初始化(用於輸入)
    {
        len = a.size();
        for(int i = 0; i < len; i++)
        {
            if(a[len-1-i] >= 'A')
            {
                s[i] = a[len-i-1] -'A'+10;
            }
            else 
            {
                s[i] = a[len-i-1] -'0';
            }
        }
        base = b;
    }
    qi operator + (const qi &b)//+
    {
        qi c;
        c.len = 0;
        for(int i = 0, g = 0; g || i < max(len, b.len); i++)
        {
            int x = g;
            if(i < len) x += s[i];
            if(i < b.len) x += b.s[i];
            c.s[c.len++] = x % base;
            g = x / base;
        }
        return c;
    }
    qi operator = (const qi &x)//複製
    {
        len = x.len;
        for(unsigned i = 0; i != len; ++i)
        {
            s[i] = x.s[i];
        }
        base = x.base;
    }
    qi operator += (const qi &x)//就是作上面寫好的"+"
    {
        *this = *this+x;
        return *this;
    }
    void reverse()//反轉
    {
        for(unsigned i = 0; i != len/2; ++i)
        {
            swap(s[i], s[len-1-i]);
        }
        return ;
    }
}x,y;

void Init()
{
    scanf("%d", &Base);
    cin >> n;
    x = qi(n, Base);
    return ;
}

bool check(const qi &a)
{
    for(unsigned i = 0; i != a.len/2; ++i)
    {
        if(a.s[i] != a.s[a.len-i-1])    return false;
    }   
    return true;
}

void Add()
{
    do
    {
        y = x;//copy
        x.reverse();//結構體函數
        x += y;
        ++times;
    }
    while(!check(x) && times < 31);
    if(times < 31)
    {
        cout << "STEP=" << times;
    }
    else
    {
        cout <<"Impossible!"; 
    }
    return ;
} 

int main()
{
    Init();
    Add();
    return 0;
}

高精度模板.net

自此完成。
箜瑟_qi 2017.04.21 12:17code

相關文章
相關標籤/搜索