水仙花数

  春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。 现在要求输出所有在m和n范围内的水仙花数。

输入描述:

输入数据有多组,每组占一行,包括两个整数m和n(100 ≤ m ≤ n ≤ 999)。

输出描述:

对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。

示例1

输入

100 120
300 380

输出

no
370 371

好多人不知道格式怎么弄,先普及一下:
1.“输入数据有多组,每组占一行“
    我一开始接触g++时也是先想到用数组输入,纳闷数组没有限制终止条件。后来明白还有个东西叫"~scanf"。把代码嵌入到while(~scanf("%d",&n)){//代码段}中就行了。它的原理是:
    a.正常输入的时候,scanf返回输入的数字如1,2,3等等,对这些数字取非,不会成为0,就会执行循环;
    b.错误输入,就是没有输入的时候,scanf返回的是EOF(End Of File),EOF=-1,对EOF取非,即对-1取非得到0,就会跳出循环。
2."要求从小到大排列在一行内输出,之间用一个空格隔开"
    这里其实包含了两层意思,一个是要求各输出间有空格,另一个是最后一个输出后面没有空格。
所以可以添加一层if/else判断语句,并在各子语句后输出\n换行,因为可能包含多组数据。如果输出只有一个数,则将其单独考虑。如果有多个,则先输出第一个数据,再用空格+%d的方式输出剩余数据。
思路:
    判断一个三位数是不是水仙花数,首先要得到它的百、十、个位上的数字,百位可以将其整除以100,十位可以将其整除以10再除以10取其余数,个位则直接将其除以10取余。
    有多组输入数据,意味着输出结果有多个,所以可以定义一个全局变量的整形数组,将输出结果保存在数组中,并用一个初始值为0的变量计数。

代码如下:

 1 #include<stdio.h>
 2 int s=0;
 3 int w[1000]={0};
 4 void judge(int m,int n)
 5 {
 6     int a,b,c,i;
 7     for(i=m;i<=n;i++)
 8     {
 9         a=i/100;
10         b=(i/10)%10;
11         c=i%10;
12         if(i==a*a*a+b*b*b+c*c*c)
13         {
14             w[s]=i;
15             s++;
16         }
17     }
18 }
19 int main()
20 {
21     int m,n;
22     int i=0;
23     while(~scanf("%d %d",&m,&n))
24     {
25         judge(m,n);
26         if(s==0)
27             printf("no\n");
28         else if(s==1)
29             printf("%d\n",w[0]);
30         else
31         {   
32             printf("%d",w[0]);
33             for(i=0;i<s;i++)
34                 printf(" %d",w[i]);
35             printf("\n");
36         }
37     }
38     return 0;
39 }

输入:100 1000

运行结果:

 

posted @ 2018-08-22 14:47  望三星  阅读(304)  评论(0编辑  收藏  举报