我们首先要明确水仙花数的概念:
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。
水仙花数共有4个:分别为153,370,371,407。
1^3+5^3+3^=153, 3^3+7^3+0^3=370,3^3+7^3+1^3=371,4^3+0^3+7^3=407。
可以看出,想要判断一个数字是否是水仙花数,首先要求出这个数字百位,十位,个位上的数,再求出它们的三次幂之和,于是根据规律写出代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;
int main()
{
//遍历100-999之间的数字
for (int i = 100; i < 1000; i++)
{
int a=i%10; //取个位数字
int b = (i / 10) % 10;//取十位数字
int c= ((i / 10)/10) % 10;//取百位数字
if (a * a * a + b * b * b + c * c * c == i)
{
cout << i << " ";
}
}
system("pause");
return EXIT_SUCCESS;
}
输出结果如下:
水仙花数,只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。其他的自幂数还有:
一位 | 独身数 | 0,1,2,3,4,5,6,7,8,9 |
四位 | 四叶玫瑰数 | 1634,8208,9474 |
五位 | 五角星数 | 54748,92727,93084 |
六位 | 六合数 | 548834 |
七位 | 北斗七星数 | 1741725,4210818,9800817,9926315 |
八位 | 八仙数 | 24678050,24678051,88593477 |
九位 | 九九重阳数 | 146511208,472335975,534494836,912985153 |
十位 | 十全十美数 | 4679307774 |
其中一位数的自幂数就是本身,二位的自幂数不存在。
在求水仙花数的过程中,我们是分别设置了a,b,c三个变量,分别用来存储个位,十位,百位的数字。但是如果增加位数,这种方法就会显得过于麻烦,增大代码量。所以要求出更高位数的自幂数,也是先求出各个数位上的数字,对每一位的n次幂再进行求和。所以我们要关注的是怎样求出每个数位上的数字,寻找规律,使用循环结构。
在求水仙花数的代码中,取每个数位数字的时候,我们使用了取模%运算,取模运算是求两个数相除的余数,我们代入数字123,123%10的过程为,123除以10等于12余3,那么123%10的结果就为3,可以看出3正是123的个位数字。一个十进制数除以10就可以缩减一个数位,所以我们将123除以10得到的商12,再%10,就得到了12的个位数字,也就是123的十位数字2,最后用12除以10的商1,再次%10,得到1,也就是123的百位数字。于是,一个三位数的各数位上的数字都被取出。所以这个规律就是,先取模10,之后每次除以10之后取模再取模10,直至所有数位被取出。
程序代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;
int main()
{
for (int i = 0; i < 1000000; i++)
{
int np = 1; // 表示数位
int temp = i; //防止i的值在循环中被改变,新定义一个变量值接收i的值
while (temp / 10)
{
np++;
temp = temp / 10;
}
int sum = 0; //次幂和
temp = i; //再次使用temp接收i的值
while (temp)
{
sum+=pow(temp % 10, np); //pow函数求次幂
temp = temp / 10;
}
if (sum == i)
{
cout << i << " ";
}
}
system("pause");
return EXIT_SUCCESS;
}
在for循环里,i从0取值到1000000,也就是能计算出1至6位所有的自幂数,np表示数位,定义变量temp 接收i的值,避免i的值在循环中被改变,从而陷入死循环。使用while()循环,括号中的条件为temp/10,当temp为1—9时,表达式结果为0,跳出循环。每次temp除以10,np便执行++操作。
sum整形变量是各个数位的次幂和,这里使用pow函数用来求次幂。
pow函数包含在
_Check_return_ double __cdecl pow(_In_ double _X, _In_ double _Y); 表示用来求X的Y次幂。
最后是判断,如果各个数位的次幂和等于这个数本身,就符合自幂数的条件,将这个数输出。
输出结果如下: