原题链接 http://acm.hdu.edu.cn/showproblem.php?pid=2010
题目描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。
现在要求输出所有在m和n范围内的水仙花数。
Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
Simple Input
100 120
300 380
Simple Output
no
370 371
题目分析:
题目的大体意思就是输出某区间内符合要求的数字(水仙花数),如果输入的该区间内不存在水仙花数,则输出no。
按照题目大意我们能写出以下程序。但显然仅仅这样还是不够的。
#include <stdio.h>
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n))
{
int ok=0;
for(int i=m;i<=n;i++)
{
int a=i%10,b=i/10%10,c=i/100;
if(a*a*a+b*b*b+c*c*c==i) printf("%d",i),ok=1;
}
if(ok==0) printf("no\n");
else printf("\n");
}
return 0;
}
我们将输入样例输入到程序中,得到以下结果:
显然缺少了一些什么。若干个水仙花数之间应该保留一定的距离。
那么我们如果让每个水仙花数后自带空格,可不可以呢?我们来实现一下,我们只需要在输出函数中多写一个空格就好了。
我们将输入样例输入到程序中,得到以下结果:
好像结果看起来跟输出样例一模一样了,让我们提交一下看看吧。
啊哦,出乎我们意料。我们并没有得到“Accept”,反而得到了一个叫做“Presentation Error”的状态。
这里解释一下“Presentation Error”,这个状态叫做格式错误,它意味着你的程序运行输出结果是对的,但往往是因为以下原因:
- 每行输出之后有空行
- 每两行输出之间有空行
- 一行中,每个输出数字(或字符串,等)之间有空格
- 一行中,每个输出数字(或字符串,等)之后有空格
看到这里你可能已经明白了。我们最后输出的水仙花数之后不可以存在空格。
那我们就来消除它,我们可以用标记变量来确保不会在最后一个数字之后不会输出多余的空格。
我们这里有两种办法:
- 在我们明确知道会输出几个数字的时候,我们可以对最后一个数字特殊处理
- 但当我们并不知道会有几个输出的时候,我们就应该反过来思考,对第一个输出结果如数处理。
当然第二种处理方法也可以用在第一种情况中。
那么让我们分析一下吧,我们这道题到底是属于哪种情况呢?
是的,它显然属于第二种!
好的,如果在输出第一个水仙花数的时候我们的标志变量为0,那么这个过程之后就让标记变量发生变化吧。我们可以使它每次输出完成后进行自增运算,或者我们可以只记住没有任何输出前的标记变量,只要它发生任何改变,那么以后的输出中都不会带有空格了。
我们按照我们所描述的,对代码做了如下修改:
#include <stdio.h>
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n))
{
int ok=0;
for(int i=m;i<=n;i++)
{
int a=i%10,b=i/10%10,c=i/100;
if(a*a*a+b*b*b+c*c*c==i)
{
if(ok==0)printf("%d",i),ok=1;
else printf(" %d",i);
}
}
if(ok==0) printf("no\n");
else printf("\n");
}
return 0;
}
结果显而易见,我们得到了“Accept”。
再练习算法题的过程中,格式错误是最简单且容易处理的的一种错误类型。只要大家勤练习,这种错误压根不是问题。
那么你学会了吗?