求出0~999之间的所有“水仙花数”并输出

“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。

/*
在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数:
153 = 1^3 + 5^3 + 3^3。
370 = 3^3 + 7^3 + 0^3。
371 = 3^3 + 7^3 + 1^3。
407 = 4^3 + 0^3 + 7^3。
*/

思路:同理可以用提取整数每一位的方法来实现,将每一位的数字先立方然后在求和,同原来的数字比较大小,如果和原来是一样的值则输出,不一样则继续循环。

方法一:

 1 #include<stdio.h>
 2 int main()
 3 {
 4         int a, b, c;
 5     int count = 0;
 6     for (int i = 100;i < 1000;i++)
 7     {
 8         a = i % 10;//提取整数的个位数字
 9         b = (i / 10) % 10;//提取整数的十位数字
10         c = (i / 100) % 10;//提取整数的百位数字
11         //判断是否为水仙花数字
12         if (i == a * a*a + b * b*b + c * c*c)
13         {
14             count++;//个数
15             printf("%d
", i);
16         }
17     }
18     printf("count=%d", count);
19 
20         return 0;   
21 }    

方法二:

第二种方法要注意一点,因为代码中有temp=temp/10;将原来的i值改变了,不能用与if语句的判断,所以应该在用一个临时变量来将i的值保存,方便之后的比较。

 1 #include<stdio.h>
 2 int main()
 3 {    
 4     int i;
 5     for (i = 100;i < 1000;i++)
 6     {
 7         int sum = 0;
 8         int temp = i;
 9                 //下面if语句要与原来的i进行比较,如果不保存i 的值会使得后面的i发生变化
10         while (temp)
11         {
12             int num = temp % 10;//取个位的数字
13             sum = sum + num * num * num;//求立方和
14             temp = temp / 10;//将三位数变为两位数
15         }
16         if (sum == i)//判断是否为水仙花数
17         {
18             printf("%d
", i);
19         }
20     }
21     return 0;
22      
23 }       
原文地址:https://www.cnblogs.com/cuckoo-/p/10295245.html