/*
求解从1到20000内的所有水仙花数:每位数字的n次方之和等于其本身,n是这个数的位数。

共五位数,设置一个数组用来保存数字的每一位,数组的有效长度就是该数的位数。最后读取数组的每位数字来判断水仙花数。
*/
#include <stdio.h>
#include <stdlib.h>
//如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 * 则是取内容操作符,意思是取这个内存地址里存储的内容。
void getPerBite(int num,int bArray[],int *bArrayLength)//num的每位数字存储到数组bArray中
{
    while(num > 0)
    {
        bArray[*bArrayLength] = num % 10;//取num的每一位数字
        *bArrayLength += 1;//数组实际长度+1
        num /= 10;//从num中删除一位数字
    }
}
int pow(int x,int y)//求x的y次幂
{
    int mul = 1;
    for(int i = 1;i <= y; i++)
    {
        mul *= x;
    }
    return mul;
}
void isNarcNum(int num,int bArray[],int bArrayLength)//判断num是否为水仙花数
{
    int bSum = 0;
    for(int i = 0;i < bArrayLength;i++)//访问num的每一位
    {
        bSum += pow(bArray[i],bArrayLength);
    }
    if(bSum == num)
        printf("%d\n",num);
}
int main()
{
    for(int iNum = 1;iNum <= 20000;iNum ++)
    {
        int bArray[10] = {0};
        int bArrayLength = 0;
        getPerBite(iNum,bArray,&bArrayLength);//取出num中每一位存储到数组bArray中
        isNarcNum(iNum,bArray,bArrayLength);
    }
}