题目解析

我们需要通过最少的操作次数,使得给定的正整数 nn 的十进制表示中至少包含一个数字 77。每次操作可以加上任意一个完全由 99 组成的数(例如 999999999999999999999999999999 等)。


核心思路

当加一个由 99 组成的数时,数位的值会按照 (n+9)mod10(n + 9) \mod 10 的规律变化。例如,个位加 99 时,数值变化序列为:

000+9=999+9=18818+9=27727+9=36636+9=45545+9=54454+9=63363+9=72272+9=81181+9=9000 \rightarrow 0 \\ 0 + 9 = 9 \rightarrow 9 \\ 9 + 9 = 18 \rightarrow 8 \\ 18 + 9 = 27 \rightarrow 7 \\ 27 + 9 = 36 \rightarrow 6 \\ 36 + 9 = 45 \rightarrow 5 \\ 45 + 9 = 54 \rightarrow 4 \\ 54 + 9 = 63 \rightarrow 3 \\ 63 + 9 = 72 \rightarrow 2 \\ 72 + 9 = 81 \rightarrow 1 \\ 81 + 9 = 90 \rightarrow 0 \\

循环周期为 1010。因此,对于任意数位,最多需要 99 次操作即可遍历所有可能的数值。

我们枚举所有长度为 191 \sim 9 的完全由 99 组成的数,将其加到 nn 后检查结果是否包含 77,并记录最小操作次数。


AC Code

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
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t, n, ans = 100;
int nine[10];

signed main() {
cin >> t;
for (int i = 1; i <= 9; i++) nine[i] = nine[i-1] * 10 + 9; // 预处理 9、99、……、999999999
while (t--) {
cin >> n;
ans = 100;
for (int i = 1; i <= 9; i++) {
for (int j = 0; j <= 10; j++) {
int k = n + nine[i] * j;
bool flag = false;
while (k > 0) {
if (k % 10 == 7) flag = true; // 检查是否含有 7
k /= 10;
}
if (flag) ans = min(ans, j); // 更新答案,统计最小值
}
}
cout << ans << endl;
}
return 0;
}