【PAT乙級】1079 延遲的迴文數
給定一個 k+1 位的正整數 N,寫成 ak⋯a1a0 的形式,其中對所有 i 有 0≤ai<10 且 ak>0。N 被稱為一個迴文數,當且僅當對所有 i 有 ai=ak−i。零也被定義為一個迴文數。
非迴文數也可以通過一系列操作變出迴文數。首先將該數字逆轉,再將逆轉數與該數相加,如果和還不是一個迴文數,就重複這個逆轉再相加的操作,直到一個迴文數出現。如果一個非迴文數可以變出迴文數,就稱這個數為延遲的迴文數
給定任意一個正整數,本題要求你找到其變出的那個迴文數。
輸入格式:
輸入在一行中給出一個不超過1000位的正整數。
輸出格式:
對給定的整數,一行一行輸出其變出迴文數的過程。每行格式如下
A + B = C
其中 A
是原始的數字,B
是 A
的逆轉數,C
是它們的和。A
從輸入的整數開始。重複操作直到 C
在 10 步以內變成迴文數,這時在一行中輸出 C is a palindromic number.
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;
}
總結
學習不息,繼續加油