题目描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3 + 5^3 + 3^3 现在要求输出所有在m和n范围内的水仙花数。
输入描述
输入数据有多组,每组占一行,包括两个整数m和n(100 ≤ m ≤ n ≤ 999)。
输出描述
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
思路分析
问题及解决办法
1. 如何判断一个数是水仙花数?(题目已经举例)
水仙花数就是一个三位数,其个位、十位、百位上数字的立方和仍等于该数字的数。
2.如何在不知道输入多少个区间的情况下,连续输入?
循环输入会用到while循环语句,在while循环语句中,EOF作为文件结束符。
3.如何将所有结果一同输出,且每个实例的输出各占一行空间?
我们会想到将每个实例的元素使用数组来保存起来,其中每个实例之间用-1间隔开来。其中的输出no可用1在数组中表示,输出时在转换回去。
具体步骤
- 输入一个区间
- 循环遍历区间中的数字
(1) 判断是否为水仙花数:是—>存入区间;不是—>不做任何处理。
(2)如果该区间中没有元素,将在数组中,保存为1。
(3) 一个区间遍历结束后,在数组中保存-1,来隔开两个区间的元素。 - 循环处理输入的区间直至结束。
- 将保存在数组中的元素输出:
(1) 遇到1,输出 no
(2) 遇到-1,换行
(3) 其余数字,正常输出;如果下一个不是-1,输出空格间隔开两个数字。
代码如下:
#include <stdio.h>
int main()
{
//创建一个数组,将一个区间中的水仙花数保存到数组中,没有水仙花数的存为0,测试实例中件水仙花数用-1隔开
int arr[50] = {0};
int m = 0, n = 0; //定义两个整数,用于表示区间
int i = 0;
while(scanf("%d%d", &m, &n) != EOF)
{
//1.收到输入数据循环判断元素是否为水仙花数--->是,存入数组--->不是,继续往下面走
int flag = 0; //用于标记区间中有没有水仙花数
while(m <= n)
{
//数字为水仙花数
if((pow(m%10, 3) + pow((m/10)%10, 3) + pow(m/100, 3)) == m)
{
arr[i++] = m;
flag = 1; //如果有水仙花数,flag状态一点会被改变为1
}
m++;
}
//处理区域内没有水仙花数的状态
if(!flag)
{
arr[i++] = 1;
}
//区间水仙花数判断结束,数组中保存-1,隔开二者
arr[i++] = -1;
}
//输出数组中的水仙花数,每个测试实例输出占一行
int k = 0;
while(k < i)
{
if (arr[k] == 1)
{
printf("no");
}
else if(arr[k] == -1)
{
printf("\n");
}
else
{
printf("%d", arr[k]);
if(arr[k+1] != -1)
{
printf(" ");
}
}
arr[k] = 0;
k++;
}
return 0;
}