whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1079 || 延迟的回文数(详解,C/C++示例,测试点分析)

Posted on 2019-12-29 In PAT

延迟的回文数

题目描述

给定一个 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位的正整数。

输出格式

对给定的整数,一行一行输出其变出回文数的过程。每行格式如下

1
A + B = C

其中 A 是原始的数字,B 是 A 的逆转数,C 是它们的和。A 从输入的整数开始。重复操作直到 C 在 10 步以内变成回文数,这时在一行中输出 C is a palindromic number.;或者如果 10 步都没能得到回文数,最后就在一行中输出 Not found in 10 iterations.。

输入样例1

1
97152

输出样例1

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

输入样例2

1
196

输出样例2

1
2
3
4
5
6
7
8
9
10
11
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.

问题解决

解题思想

此题我主要采用了STL的字符串string进行处理。主要设置了三个函数,分别为逆转函数、大数相加函数以及判断是否为回文数函数。注意string的一些特性,此题也不难。

坑点提醒

None

代码示例(C/C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <vector>
using namespace std;

//逆转
void reverse(string a, string& b) {
b.clear();
int len = a.size();
for (int i = len - 1; i >= 0; i--) {
b += a[i];
}
}
//相加
void big_add(string a, string b, string& c) {
c.clear(); //注意清空
int len = a.size();
int m = 0;
for (int i = len - 1; i >= 0; i--) {
int tmp = a[i] + b[i] - 2 * '0' + m;
c += (tmp % 10 + '0');
m = tmp / 10;
}
if (m) { //有进位
c += m + '0'; //注意都要转换为字符
}
}
//判断是否为回文数
int is_pal(string a) {
int len = a.size();
for (int i = len - 1; i >= 0; i--) {
if(a[i] != a[len - i -1]) {
return 0;
}
}
return 1;
}
int main() {
string vi;
cin >> vi;
int num = 10;
if (is_pal(vi)) {
cout << vi << " is a palindromic number." << endl;
return 0;
}
string b;
string c;
string t;
while (num--) {
reverse(vi, b);
big_add(vi, b, c);
reverse(c, t);
cout << vi << " + " << b << " = " << t << endl;
if (is_pal(c)) {
cout << t << " is a palindromic number." << endl;
return 0;
}
vi = t;
}
cout << "Not found in 10 iterations.";
return 0;
}

题目来源:PAT乙级1079
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1078 || 字符串压缩与解压(详解,C/C++示例,测试点分析)
PAT乙级1080 || MOOC期终成绩(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 延迟的回文数
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例1
    5. 1.5. 输出样例1
    6. 1.6. 输入样例2
    7. 1.7. 输出样例2
    8. 1.8. 问题解决
      1. 1.8.1. 解题思想
      2. 1.8.2. 坑点提醒
      3. 1.8.3. 代码示例(C/C++)
© 2021 Mengzhao Wang