一、先了解水仙花数
在了解变种水仙花数之前我们先了解一下“水仙花数”。“水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。”
那么100 ——999之间的水仙花数都有哪些呢?
1.首先我们分析一下,判断一个数n是不是水仙花数,我们需要对该数字n进行拆分,拆出该数字n的个位数、十位数、以及百位数。
2.拆分方法:
个位数:n%10
十位数:n/10%10
百位数:n/10
3.判断:如果n的个位数,十位数,百位数的三次方相加等于n,那么该数就是水仙花数。
也可用函数库中的pow()函数,别忘记引用头文件“math.h”。
n == a * a * a + b * b * b + c * c * c
n == pow(a, 3) + pow(b, 3) + pow(c, 3)
4.实现代码
#include<stdio.h>
#include"math.h"
int main()
{
printf("100到999之间的水仙花数: \n");
int n, a, b, c;
for (n = 100; n <= 999; n++) //水仙花数的取值范围
{
int a = n % 10;//个位数
int b = (n / 10) % 10;//十位数
int c = n / 100;//百位数
//判断个位、十位、百位的立方和是否与原数n相等
if (n == pow(a, 3) + pow(b, 3) + pow(c, 3))
printf("%d ", n);
//if (n == a * a * a + b * b * b + c * c * c) //
// printf("%d ", n);
}
return 0;
}
运行结果:
二、变种水仙花数
1.什么是变种水仙花数?
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461), (14和61), (146和1), 如果所有拆分后的乘积之和等于自身,则是一个Lily Number。l例如:655 = 6 * 55 + 65 * 5
1461 = 1 * 461 + 14 * 61 + 146 * 1
2.五位数中的变种水仙花数都有哪些呢。
根据对变种水仙花数的了解,我们可以得知,五位数12345我们可以拆分成:
1*2345 12 *345 123*45 1234*5四部分,不难发现,还是拆分。定义四个部分分别为a,b,c,d
a = (i / 10000) * (i % 10000); // 1*2345
b = (i / 1000) * (i % 1000); // 12 *345
c = (i / 100) * (i % 100);// 123*45
d = (i / 10) * (i % 10);// 1234*5
3.判断拆分后的乘积之和是否等于自身
i == a+b+c+d
4.实现代码
#include<stdio.h>
int main() {
int i = 0;
printf("变种水仙花数:");
for (i = 10000; i < 99999; i++)
{
//12345
int a = (i / 10000) * (i % 10000);//1 * 2345
int b = (i / 1000) * (i % 1000); // 12 * 345
int c = (i / 100) * (i % 100); // 123 * 45
int d = (i / 10) * (i % 10); //1234 * 5
int sum = a + b + c + d;
if (i == sum) //判断拆分后乘积之和是否等于自身
{
printf("%d ", i);
}
}
return 0;
}
运行结果: