1025: 水仙花数

版权声明:看看就好,如需转载,注明一下出处 https://blog.csdn.net/sinat_34337520/article/details/89141475

说实话,水仙花这个东西已经是烂大街了,自从我们第一次学习C语言就会碰到,但即便如此,重要还是重要,以后还会碰到无数次。而我本人虽然也碰到过很多次,但很有意思每次题目都会提供给我新的实现方案。

常规思想是分别拿到个十百位,然后立方求和,这里提供另外3个版本。需要全部掌握,虽然都是求水仙花,但出题人一旦限制了编写代码的条件,一种解法就显得力不从心了。

Note: 

这里的立方没有使用 pow,因为 pow 的参数和返回值都是 double,而我们使用的原数是 int,类型不同使用 == 会有误差,导致有的水仙花没有被录入。对于 pow 的使用,参考下面的版本4,将 i, s 定为 double 型,最后也可以得到正确的结果。

double pow(double x, double y)

 

Description

打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 Output:

153
???
???
??? 

Input

Output

所有的水仙花数,从小的开始。每行一个

#include <stdio.h>
//版本1:拿到各位的立方,求和
int main()
{
    int a, b, c, i;
    for(i=100; i<1000; i++)
    {
        a = i/100;
        b = (i/10)%10;
        c = i%10;
        if(a*a*a + b*b*b + c*c*c == i)
            printf("%d\n", i);
    }
    return 0;
}

//版本2:循环减去最低位的立方,看结果是否刚好等于0
int main()
{
    int i, a, s;
    for(i=100; i<1000; i++)
    {
        s = i;
        a = i;
        while(a)
        {
            s -= (a%10)*(a%10)*(a%10);
            a /= 10;
        }
        if(s == 0)
            printf("%d\n", i);
    }
    return 0;
}

//版本3:循环加上最低位的立方,看结果是否等于 i
int main()
{
    int i, a, s;
    for(i=100; i<1000; i++)
    {
        s = 0;
        a = i;
        while(a)
        {
            s += (a%10)*(a%10)*(a%10);
            a /= 10;
        }
        if(s == i)
            printf("%d\n", i);
    }
    return 0;
}
//版本4:使用pow
int main()
{
    int a;
    double i, s;//这里用double
    for(i=100; i<1000; i++)
    {
        s = 0;
        a = i;
        while(a)
        {
            s += pow(a%10, 3);//使用 pow
            a /= 10;
        }
        if(s == i)
            printf("%.0lf\n", i); //限制double的输出格式
    }
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/sinat_34337520/article/details/89141475