水仙花数
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如: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
运行结果: