打印从0-1000/0-100000水仙花数与变种水仙花数

水仙花数的定义:

水仙花数是指一个 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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值