auj 502 不只是水仙花

http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=502

题目大意

C语言里有个很著名的问题叫做水仙花数。水仙花数是一个三位数,它的各位数字的立方相加后等于该数字。多么美丽的数字啊!
可是Large发现这个世界上不仅仅有水仙花,正如整数不仅仅只有三位数一样。
Large经过仔细研究,发现有很多花比水仙花数更优美,我们现在做出如下定义:

班花数:它是一个四位数,各位数字的四次方相加后等于该数。

级花数:它是一个五位数,各位数字的五次方相加后等于该数。

校花数:它是一个六位数,各位数字的六次方相加后等于该数。

我们的任务就是,对于输入的一个整数,判断它是上述数的哪一种。
包含多组数据,第K组数据格式如下:

第K行:每行包括一个正整数N(100<N<1000000) 输入以EOF作为结束

每组数据输出一行,第K组数据格式如下:

第K行:每行包括一个单词或词组,由对应的输入数字确定,其内容如下

如果该数是水仙花数,输出Daffodil

如果该数是班花数,输出Class Flower

如果该数是级花数,输出Grade Flower

如果该数是校花数,输出OH~

如果该数不满足任何一个定义,输出一个Nothing

Sample Input

153

12345

Sample Output

Daffodil

Nothing

方法与总结

  • 只要把输入的整数按位拆开,再分别求对应的幂次,最后比较和与原数是否相等即可。你也可以打表过数据,因为满足这样条件的数实在是太少了,尤其是校花,只有一个啊~
  • 本题由于要进行a的b次方运算,所以我刚开始使用了math.h中的pow函数,从而导致了错误。原因是pow函数接受和返回的数值均为浮点型,在计算和比较时可能会带来误差。如果自己动手编写一个整型的pow函数就可以避免这个问题。

代码

#include<iostream>
using namespace std;

int PP(int num,int n)
{
    int pk=1;
    for(int i=0;i<n;i++)
        pk*=num;
    return pk;
}
bool isDaf(int n)
{
    int sum=0,mark=n;
    while(n>0)
    {
        sum+=PP(n%10,3);
        n/=10;
    }
    if(sum==mark && mark>=100 && mark<=999)
        return 1;
    return 0;
}

bool isCla(int n)
{
    int sum=0,mark=n;
    while(n>0)
    {
        sum+=PP(n%10,4);
        n/=10;
    }
    if(sum==mark && mark>=1000 && mark<=9999)
        return 1;
    return 0;
}

bool isGra(int n)
{
    int sum=0,mark=n;
    while(n>0)
    {
        sum+=PP(n%10,5);
        n/=10;
    }
    if(sum==mark && mark>=10000 && mark<=99999)
        return 1;
    return 0;
}

bool isSch(int n)
{
    int sum=0,mark=n;
    while(n>0)
    {
        sum+=PP(n%10,6);
        n/=10;
    }
    if(sum==mark && mark>=100000 && mark<=999999)
        return 1;
    return 0;
}

int main()
{
    int n;
    while(cin>>n)
    {
        if(isDaf(n))
            cout<<"Daffodil"<<endl;
        else if(isCla(n))
            cout<<"Class Flower"<<endl;
        else if(isGra(n))
            cout<<"Grade Flower"<<endl;
        else if(isSch(n))
            cout<<"OH~"<<endl;
        else
            cout<<"Nothing"<<endl;
    }
    return 0;
}
/* bottom:40px 距浏览器底部距离 right:40px 距浏览器右边距离 */