1. 程式人生 > >【PAT乙級】1079 延遲的迴文數

【PAT乙級】1079 延遲的迴文數

給定一個 k+1 位的正整數 N,寫成 a​k​​⋯a​1​​a​0​​ 的形式,其中對所有 i 有 0≤a​i​​<10 且 a​k​​>0。N 被稱為一個迴文數,當且僅當對所有 i 有 a​i​​=a​k−i​​。零也被定義為一個迴文數。

非迴文數也可以通過一系列操作變出迴文數。首先將該數字逆轉,再將逆轉數與該數相加,如果和還不是一個迴文數,就重複這個逆轉再相加的操作,直到一個迴文數出現。如果一個非迴文數可以變出迴文數,就稱這個數為延遲的迴文數

。(定義翻譯自 https://en.wikipedia.org/wiki/Palindromic_number )

給定任意一個正整數,本題要求你找到其變出的那個迴文數。

輸入格式:

輸入在一行中給出一個不超過1000位的正整數。

輸出格式:

對給定的整數,一行一行輸出其變出迴文數的過程。每行格式如下

A + B = C

其中 A 是原始的數字,B 是 A 的逆轉數,C 是它們的和。A 從輸入的整數開始。重複操作直到 C 在 10 步以內變成迴文數,這時在一行中輸出 C is a palindromic number.

;或者如果 10 步都沒能得到迴文數,最後就在一行中輸出 Not found in 10 iterations.

輸入樣例 1:

97152

輸出樣例 1:

97152 + 25179 = 122331
122331 + 133221 = 255552
255552 is a palindromic number.

輸入樣例 2:

196

輸出樣例 2:

196 + 691 = 887
887 + 788 = 1675
1675 + 5761 = 7436
7436 + 6347 = 13783
13783 + 38731 = 52514
52514 + 41525 = 94039
94039 + 93049 = 187088
187088 + 880781 = 1067869
1067869 + 9687601 = 10755470
10755470 + 07455701 = 18211171
Not found in 10 iterations.

個人理解

這題主要是兩個小問題,第一個是大整數的加法,還有一個是判斷迴文數。

所有的數字都用字串來儲存,由於是兩個互為reverse的整數相加,所以可以直接從第0位進行加法,最後結果再reverse一下就可以了。其中每位的結果s = (n1 + n2 + c) % 10,每位的進位c = (n1 + n2 + c) / 10,c的初值設為0。注意最後一位的加法可能有進位。

判斷迴文數只需要將字串從頭開始和從尾開始同時進行檢查,如果都相等則為迴文數,否則則不是。

程式碼實現

#include <cstdio>
#include <cstring>
#include <string>
#include <set>
#include <cmath>
#include <algorithm>
#include <iostream>
#define ll long long
#define ep 1e-5
#define INF 0x7FFFFFFF

using namespace std;

// 檢查是否是迴文數
bool check(string num) {
    int len = int(num.length());
    for (int i = 0, j = len-1; i <= j; i ++, j --) {
        if (num[i] != num[j]) {
            return false;
        }
    }
    return true;
}

// 加法運算
string add(string num, string rev_num) {
    string ret = "";
    int len = int(num.length());
    
    int c = 0;
    for (int i = 0; i < len; i ++) {
        int s = ((num[i]-'0') + (rev_num[i]-'0') + c) % 10;
        c = ((num[i]-'0') + (rev_num[i]-'0') + c) / 10;
        ret += (s + '0');
        if (i == len-1 && c > 0) {
            ret += (c + '0');
        }
    }
    reverse(ret.begin(), ret.end());
    return ret;
}

int main() {
    // 輸入原始數字
    string num;
    cin >> num;

    // 進行迴文數運算迭代
    int cnt = 0;
    while (!check(num)) {
        cnt ++;
        // 如果迭代次數超過10次輸出並結束程式
        if (cnt > 10) {
            cout << "Not found in 10 iterations." << endl;
            break;
        }
        string rev_num = num;
        reverse(rev_num.begin(), rev_num.end());
        cout << num << " + " << rev_num;
        num = add(num, rev_num);
        cout << " = " << num << endl;
    }

    //如果迭代次數小於等於10次說明找到迴文數,並輸出
    if (cnt <= 10) {
        cout << num << " is a palindromic number." << endl;
    }
    
    return 0;
}

總結

學習不息,繼續加油