• PAT A1136 A Delayed Palindrome [大数加法]


    题目描述

    链接
    将数字(不超过1000位)反转求和得到的结果是否是回文数

    分析

    • 需要的函数,数字反转,大数求和,判断是否是回文数
    • 一开始其实不需要考虑大数的问题!!这样至少能过很多样例!!!
    • 这样数字可以就用纯数字long long表示!!!!(其实用nums数组最开始就保存更方便!!!)
    • 数字反转:用nums数组保存每一位,每一个得到的方法就是循环取余。反转的话可以用reverse函数
    • 加法的话可以按照进制转换那样求和
    • 回文数:可以循环判断,也可以直接反转,看数和反转的数是否相等
    • 这样过不了一个大数样例,可以写大数加法,但是记得大数的话:数字低位在数组的低位。所以需要reverse。加法完成后,还需要reverse回来。然后记得进位的情况
    • 另外!!记得多位数字串的时候!!不要总想用字符串!int数组也可以考虑!!!
    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    ll a,b,c;
    
    ll reverse(ll a){
        ll res = 0;
        while(a){
            res  = res * 10 + a%10;
            a /= 10;
        }
        return res;
    }
    
    bool ispal(ll a){
        int nums[1024];
        int len = 0;
        while(a){
            nums[len++] = a % 10;
            a /= 10;
        }
        for(int i=0;i<len;i++){
            if(nums[i] != nums[len - i - 1]) return false;
        }
        return true;
    }
    
    int main(){
        scanf("%lld", &a);
        int cnt = 0;
        if(ispal(a)){
            printf("%lld is a palindromic number.
    ", a);
            return 0;
        }
        while(cnt<10){
            b = reverse(a);
            c = a + b;
            printf("%lld + %lld = %lld
    ", a,b,c);
            if(ispal(c)){
                printf("%lld is a palindromic number.
    ", c);
                return 0;
            }
            cnt++;
            a = c;
        }
        printf("Not found in 10 iterations.
    ");
    }
    

    大数加法的话

    #include<bits/stdc++.h>
    using namespace std;
    
    string s;
    //以后做题观察时限首选STL
    string rev(string s){ //重新写一个函数来产生反转字符串
        reverse(s.begin(), s.end());
        return s;
    }
    string add(string s1, string s2){ //重点!!!!
        string s;
        int carry = 0;
        for(int i=0;i<s1.length() || i<s2.length(); i++){ //注意这个写法!!!
            int temp = (s1[i]-'0' + s2[i]-'0' + carry);
            s += temp%10 + '0';
            carry = temp / 10;
        }
        if(carry!=0) s += (carry + '0'); //注意最后carry不等于0的情况
        return s;
    }
    
    bool ispal(string s){
        int len = s.length();
        for(int i=0;i<len;i++){
            if(s[i] != s[len-1-i]) return false;
        }
        return true;
    }
    
    int main(){
        string s1,s2,s3;
        cin>>s1;
        int cnt = 0;
        if(ispal(s1)){
            cout<<s1<<" is a palindromic number."<<endl;
            return 0;
        }
        while(cnt<10){
            s2 = rev(s1);
            s3 = rev(add(s1,s2));
            cout<<s1<<" + "<<s2<<" = "<<s3<<endl;
            if(ispal(s3)){
                cout<<s3<<" is a palindromic number."<<endl;
                return 0;
            }
            cnt++;
            s1 = s3;
        }
        cout<<"Not found in 10 iterations."<<endl;
    }
    
    
  • 相关阅读:
    BZOJ 1710. [Usaco2007 Open]Cheappal 廉价回文
    1709. [Usaco2007 Oct]Super Paintball超级弹珠
    1708. [Usaco2007 Oct]Money奶牛的硬币
    redis.conf配置文件说明
    Redis集群操作手册
    Redis使用手册
    oracle分区技术提高查询效率
    oracle物化视图
    Oracle解决索引碎片功能
    Linux笔记二
  • 原文地址:https://www.cnblogs.com/doragd/p/11382395.html
Copyright © 2020-2023  润新知