学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴对数字非常敏感,机缘巧合之下,他发现了一种特殊的数字,小猴称其为快乐数。快乐数定义为:如果对于一个正整数
y
y
y,如果存在一个正整数
x
x
x,使得
x
x
x加上
x
x
x的各个数字之和为
y
y
y,那么就称
y
y
y是一个快乐数,
x
x
x为
y
y
y的快乐因子。
例如:
①
y
=
205
y=205
y=205是一个快乐数,其快乐因子为
188
188
188;
②
y
=
108
y=108
y=108不是一个快乐数,其没有对应的快乐因子;
③
y
=
2021
y=2021
y=2021是一个快乐数,其快乐因子为
1996
1996
1996。
现在小猴想要询问你
q
q
q次,每次询问给出一个整数
y
y
y,你需要回答
y
y
y是否是快乐数,如果
y
y
y是快乐数,就输出对应的快乐因子,如果
y
y
y有多个快乐因子就输出最小的快乐因子,否则输出No
【输入】
第一行,包含一个整数
q
q
q,表示有
q
q
q次询问;
接下来
q
q
q行,每行包含一个正整数
y
i
y_i
yi,其中第
i
i
i行的整数
y
i
y_i
yi表示第
i
i
i次询问给出的整数。
【输出】
输出共
q
q
q行,对于第
i
i
i行,如果
y
i
y_i
yi是快乐数,就输出其对应最小的快乐因子,否则输出No,每行一个结果。
【输入样例】
3
8
15
7
【输出样例】
4
12
No
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int a[1000010];
int main()
{
for (int i=1; i<=1000000; i++) { // 枚举1-1000000
int sum = 0, x = i; // 定义数位之和、快乐因子
while (x>0) { // 数位拆分
sum += x % 10;
x /= 10;
}
if (a[sum+i]==0) { // 如果sum+i这个数没有快乐因子
a[sum+i] = i; // 其快乐因子就是i。如果有快乐因子的话,那肯定是之前更小的值,无需更新
}
}
int q;
cin >> q;
for (int i=1; i<=q; i++) { // 遍历q次询问
int y;
cin >> y; // 输入y
if (a[y]==0) { // 如果没有快乐因子,输出No
cout << "No" << endl;
} else { // 否则输出快乐因子
cout << a[y] << endl;
}
}
return 0;
}
【运行结果】
3
8
4
15
12
7
No