zoukankan      html  css  js  c++  java
  • PAT甲级1136A Delayed Palindrome

    题目链接

    https://pintia.cn/problem-sets/994805342720868352/problems/994805345732378624

    题解一

    英语

    • notation

      标记法

    • palindromic

      回文的

    • palindrome

      回文

    • be paired with

      与……配对

    思路、注意点和代码

    • 要实现回文数判断
    • 要实现字符串逆序
    • 整体思路就是题目描述的那样:判断是不是回文数,不是的话就逆序后和原数相加,重复这一过程直至得到回文数或者超过10次迭代

    下面是我刚开始时写的代码,结果是Partially Accepted,得了14分。

    // Problem: PAT Advanced 1136
    // URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805345732378624
    // Tags: String
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    bool isPalindromic(string s){
        int len = s.length();
        for (int i = 0; i < len/2; i++)
            if(s[i] != s[len-1-i])
                return false;
        return true;
    }
    
    int main()
    {
        string a_str, b_str, c_str;
        int a, b, c;
        cin >> a_str;
        int N = 10;
        while (N--){
            b_str = string(a_str.rbegin(), a_str.rend());
            c_str = to_string(stoi(a_str) + stoi(b_str));
            cout << a_str << " + " << b_str << " = " << c_str << endl;
            if (isPalindromic(c_str)){
                cout << c_str << " is a palindromic number.";
                return 0;
            }
            a_str = c_str;
        }
        cout << "Not found in 10 iterations.";
        return 0;
    }
    

    题解二

    看了下柳婼的代码,和我写的题解一相比,她的代码有以下不同:

    • 她考虑了输入就是回文数的边界情况,我没有考虑,这个测试点占4分

    • 回文数的判断方法不同,她是判断逆序后是否相等,我是遍历判断

    • 她手动实现了字符串数字的加法,而我是将字符串转成数字进而相加,这里我忽略了数值范围,这个测试点占2分

      题目说不超过1000位,就算使用longlong也不行,所以必须手动实现字符串相加

    基于我刚开始写的题解一和上面分析的内容,正确代码如下

    // Problem: PAT Advanced 1136
    // URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805345732378624
    // Tags: String Palindrome
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    bool isPalindromic(string s){
        int len = s.length();
        for (int i = 0; i < len/2; i++)
            if(s[i] != s[len-1-i])
                return false;
        return true;
    }
    
    string addString(string a, string b){
        int carry = 0;
        int sum;
        for (int i = a.length() - 1; i >= 0; i--) {
            sum = a[i] - '0' + b[i] - '0' + carry;  // 注意进位和'0'
            a[i] = sum % 10 + '0';  // 注意'0'
            carry = sum / 10;
        }
        if (carry == 1)
            a = "1" + a;
        return a;
    }
    
    int main()
    {
        string a_str, b_str, c_str;
        cin >> a_str;
        if (isPalindromic(a_str)){
            cout << a_str << " is a palindromic number.";
            return 0;
        }
    
        int N = 10;
        while (N--){
            b_str = string(a_str.rbegin(), a_str.rend());
            c_str = addString(a_str, b_str);
            cout << a_str << " + " << b_str << " = " << c_str << endl;
            if (isPalindromic(c_str)){
                cout << c_str << " is a palindromic number.";
                return 0;
            }
            a_str = c_str;
        }
        cout << "Not found in 10 iterations.";
        return 0;
    }
    

    作者:@臭咸鱼

    转载请注明出处:https://www.cnblogs.com/chouxianyu/

    欢迎讨论和交流!


  • 相关阅读:
    jQuery之防止冒泡事件
    jQuery复制节点
    jQuery查找节点
    jQuery表单选择器
    jQuery之事件触发trigger
    jQuery样式操作
    为FLASH正名!HTML5前景分析
    iframe 高度自动调节,最简单解决
    Iframe和母版页(.net)
    表单遮住弹出层解决方法(select遮住DIV)
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/13440421.html
Copyright © 2011-2022 走看看