[PAT解题报告] Palindromic Number

简单题: 给定一个数x,不断把x和其自身颠倒相加(例如x = 12,就把它和21相加),最多进行k步,是否能得到一个回文数。
分析: 虽然输入的数不超过long long但是结果可能很大。
我还是用数组表示大整数,这样方便颠倒并做加法。加法用的还是1023的方法,就是模拟笔算过程,每个数组元素存一位数。按照我的习惯,我用a[0]表示位数,a[a[0]]是最高位,a[1]是最低位(个位),判断回文数也直接循环判断。
代码:
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;

int a[120], c[120];

bool isPalindromic() {
    for (int i = 1, j = a[0]; i < j; ++i, --j) {
        if (a[i] != a[j]) {
            return false;
        }
    }
    return true;
}

void cal() {
    memset(c, 0, sizeof(c));
    for (int i = 1; i <= a[0]; ++i) {
        c[i] += (a[i] + a[a[0] - i + 1]);
        if (c[i] >= 10) {
            c[i] -= 10;
            ++c[i + 1];
        }        
    }
    c[0] = c[a[0] + 1]?(a[0] + 1):a[0];
}

void print() {
    if (a[0]) {
        for (int i = a[0]; i; --i) {
            printf("%d",a[i]);    
        }
        puts("");
    }
    else {
        puts("0");
    }
}

int main() {
long long x;
int k;
    scanf("%lld%d",&x,&k);
    for (a[0] = 0; x; a[++a[0]] = x % 10, x /= 10)
    ;
    int step = 0;
    for (; (step < k) && (!isPalindromic()); ++step) {
        cal();    
        memcpy(a, c, sizeof(a));
    }
    print();
    printf("%d\n",step);
    return 0;
}
原题链接: http://www.patest.cn/contests/pat-a-practise/1024

全部评论

相关推荐

nus2201602...:兄弟,你这个简历撕了丢了吧,就是一坨,去找几个项目,理解项目流程,看几遍就是你的了,看看八股就去干了,多看看牛客里别人发出来的简历,对着写,你这写的啥啊,纯一坨
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务