zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    (萌O(∩_∩)O)哈希知识点小结
    hash应用以及vector的使用简介:POJ 3349 Snowflake Snow Snowflakes
    BestCoder Round #3HDU 4907
    搜索:POJ2251&POJ1426&POJ3087&POJ2488
    母函数初学四大题
    欧拉函数知识点总结及代码模板及欧拉函数表
    欧几里德与扩展欧几里德算法以及青蛙的约会~
    KMP 知识点总结
    HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)
    HDU 1535 Invitation Cards(SPFA,及其优化)
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6735279.html
Copyright © 2011-2022 走看看