题解
2025-07-03 13:25:21
发布于:浙江
12阅读
0回复
0点赞
#include <iostream>
#include <string>
#include <algorithm>
// 定义 magic 函数,用于计算一个数的 magic 值
int magic(int n) {
// 如果 n 是一位数,直接返回 n
if (n < 10) return n;
std::string numStr = std::to_string(n);
std::string resultStr = "";
// 计算相邻数字差的绝对值
for (int i = 0; i < numStr.length() - 1; ++i) {
resultStr += std::to_string(std::abs(numStr[i] - numStr[i + 1]));
}
// 将结果字符串转换为整数
int result = std::stoi(resultStr);
return result;
}
// 计算一个数的 magic 指纹
int magicFingerprint(int n) {
while (n >= 10) {
n = magic(n);
}
return n;
}
int main() {
int A, B;
// 读取输入的 A 和 B
std::cin >> A >> B;
int luckyCount = 0;
// 遍历 [A, B] 区间内的所有数
for (int i = A; i <= B; ++i) {
// 计算当前数的 magic 指纹
if (magicFingerprint(i) == 7) {
// 如果 magic 指纹为 7,幸运数计数加 1
luckyCount++;
}
}
// 输出幸运数的数量
std::cout << luckyCount << std::endl;
return 0;
}
代码说明:
magic 函数:
该函数接受一个整数 n 作为输入。
如果 n 是一位数,直接返回 n。
否则,将 n 转换为字符串 numStr,然后遍历字符串,计算相邻字符的差的绝对值,并将结果存储在 resultStr 中。
最后将 resultStr 转换为整数并返回。
magicFingerprint 函数:
该函数接受一个整数 n 作为输入。
使用 while 循环,不断调用 magic 函数,直到 n 变为一位数。
返回最终的一位数,即 n 的 magic 指纹。
main 函数:
读取输入的 A 和 B。
使用 for 循环遍历 [A, B] 区间内的所有数。
对于每个数,调用 magicFingerprint 函数计算其 magic 指纹。
如果 magic 指纹为 7,则将幸运数计数 luckyCount 加 1。
最后输出幸运数的数量。
复杂度分析:
时间复杂度:对于每个数,计算 magic 指纹的时间复杂度为 O(log^10n),因为每次调用 magic 函数,数字的位数至少减少 1。遍历 [A, B] 区间内的所有数,总的时间复杂度为O((B−A+1)log^10 B)。
空间复杂度:主要是存储中间结果的字符串,空间复杂度为 O(log10n)。
不能白嫖
觉得好的花点个赞,谢谢
全部评论 2
一定要 求求了
2025-08-01 来自 浙江
1点个赞
2025-07-03 来自 浙江
1
有帮助,赞一个