天天看点

水仙花数水仙花数题目总结

水仙花数

虽然做过水仙花但做hdu里的时还是提交了好几次,确实有一些细节性的地方容易出错,记录一下。希望大家可以互相交流。

题目

Problem Description

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:

“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+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

代码如下():

#include<stdio.h>
#include<math.h>

int main()
{
    int n,m,flag;
    while(~scanf("%d%d",&m,&n))
    {
        flag=0;//flag用于判断范围内有无水仙花的
        		//每一次flag都要重新赋值
        while(m<=n)
        {
        int hun=m/100;
        int ten=m/10%10;
        int one=m%10;
            if(m==pow(hun,3)+pow(ten,3)+pow(one,3))
            {    
            //这里注意最后一个数据后是没有空格的
                if(flag==0)
                {printf("%d",m);flag=1;}
                else
                    printf(" %d",m);
            }
        m++;
        }
        if(!flag)
            printf("no\n");
        else
            printf("\n");//有水仙花数最后追加一个回车
    }
    return 0;
}
           

总结

易错点:

1.

int flag=0;

这里给flag初始化之后(也可以先不初始化),在循环内必须给flag重新赋值

flag=0

。否则这次flag的值会带入下一次样例导致出错。

2.找到水仙花的最后一项后面是没有空格的。

解决空格方法:

A.

printf("%d ");空格后置

将得到的水仙花放入一个数组中,对数组进行在最后一项输出中不要加回车。

弊端:另外开辟数组空间,且大小未知。

B

采用printf(" %d");空格前置

这样只需要在第一次时进行判断,即flag=0时,比较适合。

有帮助的话记得给个👍
           

继续阅读