“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;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 }