蓝桥-ALGO-14-回文数

来源:互联网 发布:二手书交易网站 知乎 编辑:程序博客网 时间:2024/06/04 17:45

ACM模版

描述

描述

题解

模拟题,直接模拟这个过程不断判定即可。需要注意的是最后位数可能比较大,因为每一次相加都可以粗略看做 2,而最多三十步,最后数据的大小可能超乎你的想象。一开始我数组只开了几十,WA 了一组数据,然后开到了 100 AC 了……

代码

#include <iostream>#include <cstring>using namespace std;const int MAXN = 100;const int MAXSTEPS = 30;int N, len;char s[MAXN];int num1[MAXN];int num2[MAXN];int num3[MAXN];void add(){    num3[len] = 0;    for (int i = len; i > 0; i--)    {        num3[i - 1] = (num1[i] + num2[i] + num3[i]) / N;        num3[i] = (num1[i] + num2[i] + num3[i]) % N;    }    if (num3[0])    {        len++;        for (int i = len; i > 0; i--)        {            num3[i] = num3[i - 1];        }        num3[0] = 0;    }}bool charge(){    for (int i = 1, j = len; i < j; i++, j--)    {        if (num1[i] != num1[j])        {            return 0;        }    }    return 1;}void getNum2(){    for (int i = 1; i <= len; i++)    {        num2[i] = num1[len - i + 1];    }}int main(int argc, const char * argv[]){    scanf("%d%s", &N, s + 1);    len = (int)strlen(s + 1);    for (int i = 1; i <= len; i++)    {        if (s[i] >= '0' && s[i] <= '9')        {            num1[i] = s[i] - '0';        }        else        {            num1[i] = s[i] - 'A' + 10;        }    }    int steps = 0;    while (!charge() && steps <= MAXSTEPS)    {        steps++;        getNum2();        add();        memcpy(num1, num3, sizeof(num3));    }    if (steps <= MAXSTEPS)    {        cout << "STEP=" << steps << '\n';    }    else    {        cout << "Impossible!\n";    }    return 0;}
原创粉丝点击