hdu 2010 水仙花数
题目描述
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Problem Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^ 3 + 5^ 3 + 3^ 3。
现在要求输出所有在m和n范围内的水仙花数。
Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
Sample Input
100 120
300 380
Sample Output
no
370 371
题目难点
1. 输出格式要求,见下面笔记1
2. 用bool “开关”控制输入输出
问题解答
#include <stdio.h>
int main(void)
{
int m,n,i,a,b,c;
while(scanf("%d %d",&m,&n)!=EOF)
{
bool t=0;//用 bool定义 t为一个 “开关 ”,t=0表明开关关上了,t=1表示开关打开了
//注意,这个开关定义在 for循环外面是为了保证每次输入数据的时候,开关都是关着的
for(i=m;i<=n;i++)//i既控制循环次数,又充当从 m到 n的每个数字变量
{
a=i/100;//分解数字的百位
b=(i-a*100)/10;//分解数字的十位
c=i%10;//分解数字的个位
if(i==a*a*a+b*b*b+c*c*c)//如果 i是水仙花数,则可以进行下面花括号中的操作
{
if(t==1) printf(" ");//当第一次输出水仙花数的时候,开关是关上的,所以不会输出空格,
//保证了输出的第一个水仙花前不会出现空格导致Presentation Error
//也保证了如果之后再输出水仙花数,开关会被打开,而会在第二个、第三个……水仙花数之前输出空格
//还保证了不会奇怪的在最后一个水仙花数之后输出空格
printf("%d",i);
t=1;//只要输出过,“开关 ”就打开
}
}
if(t==0) printf("no");//只有满足开关关上,即从来没有输出过水仙花数的时候才可以输出 “no”字符
printf("
");//每输入输出一次都要换行
}
}
笔记:
- 最毒瘤的是题目设置的输出格式,比如样例输出370(空格)371,只有两数之间有空格,370前和371后都要没有空格,关键做题的时候这个样例展示又看不清楚前后有没有空格,真是被Presentation Error坑死了!