小洛的数字游戏-题解

描述

小洛有一个正整数 n,他会进行若干次下列操作:

取出正整数 n 的末位,记作 x;
将 x 平方之后,保留个位,放于 n 的首位之前(如果是 0,则数字不保留前导 0);
上述两步合计为一次操作。例如有一个正整数 142,它可以进行如下操作:

取出末尾的 2,原正整数变为 14;
2
2
=4,放于 14 首位之前成为 414,第一次操作完成;
取出末尾的 4,原正整数变为 41;
4
2
=16,保留个位的 6,放于 41 的首位成为 641,第二次操作完成;
以此类推……
现在小洛想知道,对于一个正整数 n,能否进行不超过 q 次操作让其变为正整数 m。请你帮帮他。

输入描述

输入三个正整数 n,m,q。

输出描述

如果能进行不超过 q 次操作让正整数 n 变为正整数 m,则输出若干行,第 i 行输出一个正整数表示进行第 i 次操作后的正整数 n 的值。否则输出一行一个整数 −1。

代码

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
#include <bits/stdc++.h>
using namespace std;

int main() {
long long n, m;
int q;
cin >> n >> m >> q;

vector<long long> ans;
long long a = n;
bool found = false;

for (int i = 0; i < q; i++) {
int x = a % 10;
long long tmp = a / 10;
int y = (x * x) % 10;
long long next;
if (y == 0) {
next = tmp;
} else if (tmp == 0) {
next = y;
} else {
int a = to_string(tmp).length();
long long b = pow(10, a);
next = y * b + tmp;
}
ans.push_back(next);
if (next == m) {
found = true;
break;
}
a = next;
}
if (found) {
for (long long num : ans) {
cout << num << endl;
}
} else {
cout << -1 << endl;
}
return 0;
}

小洛的数字游戏-题解
https://chenxi-tijie.pages.dev/2025/07/小洛的数字游戏-题解/
作者
chenxi
发布于
2025年7月5日
许可协议