水仙花数

题目描述

 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如: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) 判断是否为水仙花数:是—>存入区间;不是—>不做任何处理。
    (2)如果该区间中没有元素,将在数组中,保存为1。
    (3) 一个区间遍历结束后,在数组中保存-1,来隔开两个区间的元素。
  3. 循环处理输入的区间直至结束。
  4. 将保存在数组中的元素输出:
    (1) 遇到1,输出 no
    (2) 遇到-1,换行
    (3) 其余数字,正常输出;如果下一个不是-1,输出空格间隔开两个数字。
代码如下:
#include 
 
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;
}

你可能感兴趣的:(水仙花数)