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!”

输入格式:
两行,分别是N,M。

输出格式:
STEP=ans

输入样例:
10
87
输出样例:
STEP=4

难度:简单


这道题主要考查两点:reverse和check。
将数存成数组的形式(也就是高精度的写法),reverse就很好写(swap一下)。

源代码如下:

/*
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;
}

高精度模板

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

 

posted @ 2017-04-21 12:18  箜瑟_qi  阅读(191)  评论(0编辑  收藏  举报