PAT甲题题解-1024. Palindromic Number (25)-大数运算

大数据加法
给一个数num和最大迭代数k
每次num=num+num的倒序,判断此时的num是否是回文数字,是则输出此时的数字和迭代次数
如果k次结束还没找到回文数字,输出此时的数字和k

如果num一开始是回文数字,那么直接输出num和0即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
const int maxn=205;
struct Bign{
    int len,num[maxn]; // 这里num[0]是最低位,num[len-1]是最高位
    Bign(){
        memset(num,0,sizeof(num));
        len=1;
    }
    Bign(int val){
        *this=val;
    }
    Bign(const char*val){
        *this=val;
    }
    //以int型赋值
    Bign operator=(int val){
        char s[maxn];
        sprintf(s,"%d",val);
        *this=s; //字符串赋值
        return *this;
    }
    //以字符串赋值
    Bign operator=(const char*val){
        len=strlen(val);
        for(int i=0;i<len;i++){
            num[i]=val[len-1-i]-'0';
        }
        return *this;
    }
    //去掉前导0
    void clean(){
        while(len>1&&!num[len-1]){
            len--;
        }
    }
    //转化为字符串
    string tostr(){
        string res="";
        clean();
        for(int i=0;i<len;i++){
            res=(char)(num[i]+'0')+res;
        }
        if(res=="")
            return "0";
        return res;
    }
    //重载+
    Bign operator+(const Bign& b)const{
        Bign c;
        c.len=0;
        for(int i=0,g=0;g||i<max(len,b.len);i++){
            int x=g;
            if(i<len)
                x+=num[i];
            if(i<b.len)
                x+=b.num[i];
            c.num[c.len++]=x%10;
            g=x/10;
        }
        return c;
    }
    //取翻转后的数
    Bign toReverse(){
        clean();
        Bign c;
        c.len=len;
        for(int i=0;i<len;i++){
            c.num[i]=num[len-1-i];
        }
        return c;
    }

};
//判断是否是回文数字
bool isPal(Bign s){
    int l=0,r=s.len-1;
    while(l<=r){
        if(s.num[l]!=s.num[r])
            return false;
            l++;
            r--;
    }
    return true;
}
int main()
{
    char s[100];
    int k;
    scanf("%s %d",s,&k);
    Bign bign=s;
    if(isPal(bign)){
        printf("%s
%d
",s,0);
    }
    else{
        for(int i=1;i<=k;i++){
//cout<<"bign:"<<bign.tostr()<<" bign Reverse:"<<bign.toReverse().tostr()<<endl;
            bign=bign+bign.toReverse();
//cout<<"   "<<bign.tostr()<<endl;
            if(isPal(bign) || i==k){
                string ans=bign.tostr();
                cout<<ans<<endl<<i<<endl;
                break;
            }
        }

    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/chenxiwenruo/p/6735279.html