学习C++从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:蓝桥杯备考冲刺必刷题(C++) | 汇总-CSDN博客
【题目描述】
在一个古老的迷宫中,有一道无尽的通道。通道上每隔一定的距离就会有一块神秘的石头,石头上刻着从
1
1
1开始的连续整数。从
1
1
1号石头开始,每块石头的编号都比前一块大
1
1
1。
石头上的数字有特殊的意义。如果你站在编号为
n
n
n的石头上,并向前走,你将会瞬间移动到编号为
n
+
x
n+x
n+x的石头上,其中
x
x
x为
n
n
n的各位数字之和。
例如,如果你站在编号为
16
16
16的石头上,由于
1
+
6
=
7
1+6=7
1+6=7,所以下一步你会移动到编号为
16
+
7
=
23
16+7=23
16+7=23的石头上。
现在,会有多次询问,你需要对每个询问输出从
1
1
1号石头出发,到达指定编号石头的最少步数,如果无法到达,则输出
−
1
-1
−1。
【输入】
输入包含一个整数
t
t
t,
(
1
≤
t
≤
100
)
(1\le t\le 100)
(1≤t≤100),表示有t个询问。
接下来t行,每行一个整数
n
n
n,
(
1
≤
n
≤
1
0
6
)
(1\le n\le 10^6)
(1≤n≤106),表示目标石头的编号。
【输出】
对于每个询问,输出一行,表示从
1
1
1号石头到达目标石头的最少步数。如果无法到达,输出
−
1
-1
−1。
【输入样例】
4
8
15
23
1000000
【输出样例】
3
-1
5
-1
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int t, n;
int a[1000005];
int main()
{
cin >> t;
int i = 1, cnt=0;
while (i<=1000000) { // 预处理1-1000000个石头中,哪些石头可以跳上去
a[i] = cnt; // 每次跳上去cnt自增1
int temp = i, ans=0;
while (temp!=0) {
ans += temp%10;
temp /= 10;
}
i = i+ans; // i+ans的石头可以跳上去
cnt++;
}
while (t--) { // t次询问
cin >> n;
if (a[n]!=0) cout << a[n] << endl; // 直接确认a[n]是否有值,有则输出a[n]
else cout << -1 << endl; // 否则输出-1
}
return 0;
}
【运行结果】
4
8
3
15
-1
23
5
1000000
-1