【枚举】水仙花数问题

水仙花数

题目描述

输出所有的"水仙花数".所谓"水仙花数"是指这样的一个三位数:其各位数字的立方和等于该数本身。例如:371是一个"水仙花数",371=33+73+1^3.

输入

输出

输出所有的"水仙花数"(从小到大的顺序输出,一行一个)

分析

首先,在读完题目后我们可以写出程序的主体框架。先假设存在一个函数能帮助我们判断数字是否是水仙花数,再结合枚举法完成主体部分。

int main()
{
    for (int i = 100; i <= 999; i++)
    {                 //遍历所有的三位数 100~999
        if (isSxh(i)) //判断是否是水仙花数
        {             //换行输出水仙花数
            cout << i << endl;
        }
    }
    return 0;
}

接着,我们再完成本道题的重头部分,水仙花数的判断。根据定义,我们知道若三位数字的个、十、百的三次方之和等于这个数字本身,那么他就是水仙花数。所以我们只需在位数分离的过程中添加求位数的三次方以及累加求和的过程即可算出总和。再将总和与数字进行比较即可。

bool isSxh(int num)
{ //判断Num是否水仙花数,是返回true,不是返回false
    int sum = 0, t = num;
    //sum-存放次方总和
    //t-存放num的值,便于之后比较
    while (num != 0)
    {                     //位数分离
        int u = num % 10; //u中获取位数的值
        num /= 10;
        sum += (u * u * u); //累加计算次方和
    }
    if (sum == t)
    { //将总和与原数进行比较
        return true;
    }
    else
    {
        return false;
    }
}

代码实现

最后,只需要将两部分组合起来,即可完成这道题目。

#include <iostream>
using namespace std;
bool isSxh(int num)
{ //判断Num是否水仙花数,是返回true,不是返回false
    int sum = 0, t = num;
    //sum-存放次方总和
    //t-存放num的值,便于之后比较
    while (num != 0)
    {                     //位数分离
        int u = num % 10; //u中获取位数的值
        num /= 10;
        sum += (u * u * u); //累加计算次方和
    }
    if (sum == t)
    { //将总和与原数进行比较
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    for (int i = 100; i <= 999; i++)
    {                 //遍历所有的三位数 100~999
        if (isSxh(i)) //判断是否是水仙花数
        {             //换行输出水仙花数
            cout << i << endl;
        }
    }
    return 0;
}

本题考察了枚举法以及自定义函数的应用。

不积硅步,无以至千里。
原文地址:https://www.cnblogs.com/wyloving/p/13997427.html