水仙花数的定义:
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
自幂数:
水仙花数是指一个 n 位数,它的每个位上的数字的 n次幂之和等于它本身
而水仙花数只是自幂数的一种,严格来说打印0-1000以上的水仙花数其实是让打印自幂数
打印0-1000的水仙花数
- 由于水仙花数只有3位,所以我们选择较为简单的办法:用for循环走0-1000,并分别求出i的个位十位百位,最后判断相加是否相等即可
#include <stdio.h>
int main()
{
int bit, ten, hun;
for (int i = 100; i < 1000; i++)
{
hun = i / 100;//百位
ten = i / 10 % 10;//十位
bit = i % 10;//个位
if (hun * hun * hun + ten * ten * ten + bit * bit * bit == i)
{
printf("%d\n", i);
}
}
return 0;
}
打印0-100000的 水仙花数 自幂数
- 分三步,第一步先统计i的位数(设为n),第二步将i的每一位的n次方全部加起来,最后比较是否与i相等
- 这里我们使用了
pow(a, n)
函数,即计算a的n次方,头文件为<math.h>
,同样地上一题也可以使用
#incude <stdio.h>
#include <math.h>
int main()
{
for (int i = 0; i < 100000; i++)
{
//计算i的位数
int n = 0;//位数,从零开始记
int sum = 0;//次方和
int m = i;//不能直接改变i的值
while (m)//m非零就进来
{
m /= 10;//减少一位(当m为个位数时该式子结果为零,退出循环)
n++;//位数加一
}
//计算i的每一位的n方和
m = i;
while (m)
{
sum += pow(m % 10, n);
m /= 10;
}
//比较是否是水仙花
if (i == sum)
{
printf("%d ", i);
}
}
return 0;
}
变种水仙花数的定义:
变种水仙花数:把任意的数字,从中间拆分成两个数字,如果所有拆分后的乘积之和等于自身,就是一个变种水仙花数
比如1461 可以拆分成(1和461), (14和61), (146和1),而1461 = 1*461+14*61+146*1
,则1461为变种水仙花数。
求出5位数中所有变种水仙花数:
- 代码块中我们令当i=12345时,进行分析
#include <stdio.h>
int main() {
for(int i = 10000;i<100000;i++)
{
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;
}
以此我们可以得到更高位或低位的变种水仙花求法
打印0-100000中所有的变种水仙花数:
- 相当于暴力解法,直接输出0-100000的数字,通过不同位进行不同判断
#include <stdio.h>
int main()
{
for (int i = 0; i <= 100000; i++)
{
if (i < 100)
{
if (i == (i / 10) * (i % 10))
printf("%d ", i);
}
else if (i >= 100 && i < 1000)
{
if (i == (i / 100) * (i % 100) + (i / 10) * (i % 10))
printf("%d ", i);
}
else if (i >= 1000 && 1 < 10000)
{
if (i == (i / 1000) * (i % 1000) + (i / 100) * (i % 100) + (i / 10) * (i % 10))
printf("%d ", i);
}
else if (i >= 10000 && i < 100000)
{
if (i == (i / 10000) * (i % 10000) + (i / 1000) * (i % 1000) + (i / 100) * (i % 100) + (i / 10) * (i % 10))
printf("%d ", i);
}
}
return 0;
}