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;
}

原文地址:https://www.cnblogs.com/doragd/p/11382395.html