春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,它是这样定义的:

“水仙花数” 是指一个三位数,它的各位数字的立方和等于其本身,比如:

153 = 1³ + 5³ + 3³

现在要求输出所有在 mn 范围内的水仙花数。

输入格式

输入包含多组测试数据。每组数据占一行,包含两个整数 mn。最后一行 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
        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';
        }
    }
} 
分类: Thought

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注

友情链接:Ctips' blog, Colza’s blog

站点状态:Status