C语言求水仙花数

水仙花数是指一个 n 位数(n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。下面前两种方法是求3位数的水仙花数,最后一种方法扩展到n位,供大家参考。

第一种方法代码如下:

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

int main()
{
    int i = 0;
    int j = 0;
    int k = 0;
    for (i = 0; i < 10; i++)//百位上的数
    {
        for (j = 0; j < 10; j++)//十位上的数
        {
            for (k = 0; k < 10; k++)//个位上的数
            {
                if (i * 100 + j * 10 + k * 1 == pow(i, 3) + pow(j, 3) + pow(k, 3))
                {
                    printf("%d ", i * 100 + j * 10 + k * 1);
                }

            }
        }
    }
    system("pause");
    return 0;
}

第二种方法代码如下:

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

int main()
{
    int a = 0;//个位上的数
    int b = 0;//十位上的数
    int c = 0;//百位上的数
    int i = 0;
    for (i = 100; i < 999; i++)
    {
        a = i % 10;//求得个位上的数
        c = i / 100;//求得百位上的数
        b = (i - c * 100) / 10;//求得十位上的数
        if (pow(a, 3) + pow(b, 3) + pow(c, 3) == i)
        {
            printf("%d ", i);
        }
    }
    system("pause");
    return 0;
}

第三种方法,是对3位数水仙花数的一个扩展,即n位水仙花数。基本思想是先求得这个数的位数,再求得各个位上的次方和,进而求得这个数,下面是具体实现代码:

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

int main()
{
    int i = 0;
    for (i = 0; i < 10000000; i++)
    {
        int tmp = i;//创建一个临时变量,因为i是循环变量,不能改变
        int count = 1;//这个数的位数。这里count的值要初始化为1,因为任意一个数最起码也有一位,0也有一位
        int sum = 0;
        //1.求数的位数
        while (tmp / 10)//这里循环条件要写tmp/10,如果直接写tmp,count出来的结果会比正确的结果多1,因为count初始化时值为1
        {
            count++;
            tmp = tmp / 10;
        }
        //2.求各个位的次方和
        tmp = i;//将i的值赋给临时变量tmp
        while (tmp)
        {
            sum = sum + (pow(tmp % 10, count));//tmp%10求得一个十进制数最低位的数字
            tmp = tmp / 10;//tmp/10去掉一个十进制数最低位的数字,以此循环,直到这个数为0
        }
        if (sum == i)
        {
            printf("%d ", sum);
        }
    }

    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/windyj809/article/details/79827030