Loading... 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,它是这样定义的: **“水仙花数”** 是指一个三位数,它的各位数字的立方和等于其本身,比如: 153 = 1³ + 5³ + 3³ 现在要求输出所有在 **m** 和 **n** 范围内的水仙花数。 ### 输入格式 输入包含多组测试数据。每组数据占一行,包含两个整数 **m** 和 **n**。最后一行 0 0 表示输入结束。 ### 输出格式 每组数据输出一行答案,从小到大输出所有位于 [m, n] 范围内的水仙花数,数之间用空格隔开,如果没有则输出 **no**。 ### 数据范围 100 ≤ m ≤ n ≤ 999 输入最多包含 10 组数据。 ### 输入样例 ``` 100 120 300 380 0 0 ``` ### 输出样例 ``` no 370 371 ``` ### 题目分析 由于题目要求多次询问,故打表。 (可以顺便把1 ~ 9 的三次方一起打个表,避免重复乘方) ### 代码实现 ``` #include <iostream> #include <bitset> using namespace std; using ll = long long; const int N = 1e3; int n, m, arr[10]; bitset <N> bt; inline bool check(int i) { int ans = 0, tar = i; while(i) { ans += arr[i % 10]; i /= 10; } return ans == tar; } inline void eval() { for (int i = 0; i < 10; ++i) arr[i] = i * i * i; for (int i = 100; i < N; ++i) if (check(i)) bt[i] = 1; } int main () { ios::sync_with_stdio(0); cin.tie(0); eval(); while(cin >> m >> n) { if (!m && !n) return 0; bool flag = 0; for (int i = m; i <= n; ++i) if (bt[i]) { flag = 1; break; } if (!flag) cout << "no\n"; else { while(m <= n) if (bt[m++]) cout << m - 1 << ' '; cout << '\n'; } } } ``` 最后修改:2023 年 09 月 23 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏