枚举和模拟
04 水仙花数
描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,它是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+33153=13+53+33。
现在要求输出所有在 m 和 n 范围内的水仙花数
输入格式
输入包含多组测试数据
每组数据占一行,包含两个整数 m和 n
最后一行 0 0
表示输入结束
输出格式
每组数据输出一行答案,从小到大输出所有位于 [m,n] 范围内的水仙花数,数之间用空格隔开,如果没有则输出 no
。
数据范围
100≤m≤n≤999
输入最多包含 10组数据。
输入样例
100 120
300 380
0 0
输出样例
no
370 371
解答
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
using namespace std;
//首先想到写一个验证水仙花数的函数
int IFshuixianhua(int k) {
//根据题目要求 k必然是一个三位数 所以不必用前面逆序数的思路
int num3 = k % 10;
int num2 = k/10 % 10;
int num1 = k / 100;
if (k == num1 * num1 * num1 + num2 * num2 * num2 + num3 * num3 * num3) {
return 1;
}
else {
return 0;
}
}
int main() {
//输入两个数字 必然是可以现场算出来结果的
//但是不能直接输出结果 要等输入结束之后统一输入结果
/*
确定一下最多有多少个水仙花数
发现最多只有4个水仙花数
int count = 0;
for (int i = 100; i <= 999; i++) {
if (IFshuixianhua(i) == 1) {
count++;
}
}
printf("%d", count);
*/
int arr[10][4] = {0};//初始化全部写成0
int count = -1;//表示现在是第几组数据
int a, b;
int count2;//当前有效数据 是第几个水仙花数
while (1) {
scanf("%d %d", &a, &b);
//满足条件则直接退出
if (a == 0 && b == 0) {
break;
}
//输出的是有效的数据
count++;//表示第几个有效数据
count2 = -1;
for (int i = a; i <= b; i++) {
if (IFshuixianhua(i) == 1) {
//如果是水仙花数
//应该要存储在一个地方
//等到输入0 0的时候 再统一输出
//存储在二维数组
count2++;
arr[count][count2] = i;
}
}
}
for (int i = 0; i < count+1; i++) {
//如果这一行第一个元素就是0 就输出no
if (arr[i][0] == 0) {
printf("no\n");
continue;//跳出本次循环 进入下一次循环
}
for (int j = 0; j < 4; j++) {
if (arr[i][j] != 0) {
printf("%d ", arr[i][j]);
}
}
printf("\n");
}
return 0;
}