在判断某一个数是水仙花数之前,我们先介绍一下什么是水仙花数。
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant,PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个n位数(n>=3),它的每个位上的数字的n次幂之和等于这个数本身(例如:1^3+5^3+3^3=153)
根据这个概念来实现代码就比较容易了,有一点小小的困难就是实现一个数的n次幂,这里我们介绍一个函数来实现此功能。
pow()函数,下面来举一个简单的例子,便于对次函数理解。
#include<stdio.h>
#include<math.h>
void main(void)
{
int x = 2;
int y = 3;
int z = 0;
z = pow(x, y);
printf("z=%d", z);
return 0;
}
运行结果:z=8
现在我们可以判断哪些数都是水仙花数了,代码如下。
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 100; i <= 10000; i++)//找10000以内的水仙花数
{
int tmp = i;//中间变量
int sum = 0;//求和
int count = 0;//计数
while (tmp)
{
count++;
tmp /= 10;
}
tmp = i;
while (tmp)
{
sum += pow(tmp % 10, count);//“%”用来取余数
tmp /= 10;//“/”用来取整,便于计算一个数有多少位
}
if (sum == i)
{
printf("%d\n", sum);
}
}
return 0;
}
运行结果:
到这里求水仙花数我们就会了。基于这个问题,我们我们还有如下的一个拓展题。
问题:如何求Sn=a+aa+aaa+aaaa+aaaaa的前五项之和,其中a是一个数字,例如:Sn=2+22+222+2222+22222
分析:这个问题的规律性挺强,每一项都是前一项乘以10再加第一位,为了让这个题可扩展,我们定义两个变量a(某一个数),n(前n项),就可以解决了。
代码如下:
#include<stdio.h>
int main()
{
int a = 0;
int n = 0;
int tmp = 0;
int i = 0;
int sum = 0;
scanf("%d%d", &a, &n);
for (i = 0; i < n; i++)
{
tmp = tmp * 10 + a;
sum += tmp;
}
printf("sum=%d\n", sum);
return 0;
}
运行结果: