“水仙花数”与变种“水仙花数”

目录

一.水仙花数

1.什么是水仙花数

2.设计要求

3.思路

4.分析

5.代码源

 二、变种“水仙花数”

1.什么是变种“水仙花数”

2.设计要求

3.思路

4.代码源


 

一.水仙花数

1.什么是水仙花数

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身。

如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。

2.设计要求

求出0~100000之间的所有“水仙花数”并输出。

3.思路

给定一个数据data,求取data是几位数,获取data中每个位置上的数据,利用pow函数进行次方运算,并求和,若求和结果与data元素本身相等,则为水仙花数,否则,不是。

1.计算数据num的个位数,并将其赋值给temp。

2.计算个位数的n次幂,并累加到sum中。

3.移位操作,将num减去个位数temp后,再除10,便相当于数据的右移操作。此时减少一位,并将

结果重新赋值给num。

4.重复步骤(1)的操作,直到所有的位数都得到处理为止。

4.分析

1.给定一个数,求这个数的位数

利用给个数除以10,得到比这个数低一位的数来计算这个数有多少位。

例:1是由1位数字组成,12是由2位数字组成,123是由3位数字组成。

1:1/10=0(结束)

1由1位数字组成

12:12/10=1

        1/10=0(结束)

12由2位数字组成

123:123/10=12

         12/10=1

         1/10=0(结束)

while (tmp / 10)
{
	count++;
	tmp = tmp / 10;
}

2.计算每一位数

该数字连续模10和除以10即可得到每一位。

while (tmp)
{
	n = tmp % 10
	tmp = tmp / 10;
}

3.计算每一位的n次方和

这里我们运用pow来求次方数;

必须加入头文件:#include <math.h>

pow(a, b);//计算a的b次方
#include <math.h>
while (tmp)
{
	sum += pow(tmp % 10, count);
	tmp = tmp / 10;
}

5.代码源

#include <stdio.h>

#include<math.h>

int main()
{
	int i = 0;
	for (i = 0; i <= 999999; i++)
	{
		int count = 1;
		int tmp = i;
		int sum = 0;
		//判断i是否为水仙花数
		//1. 求判断数字的位数
		while (tmp / 10)
		{
			count++;
			tmp = tmp / 10;
		}

		//2. 计算每一位的次方和
		tmp = i;
		while (tmp)
		{
			sum += pow(tmp % 10, count);
			tmp = tmp / 10;
		}

		//3. 判断
		if (sum == i)
			printf("%d ", i);
	}
	return 0;
}

571b54847f7046fabdbd54c575586043.png

 二、变种“水仙花数”

1.什么是变种“水仙花数”

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。

例如:

655 = 6 * 55 + 65 * 5

1461 = 1*461 + 14*61 + 146*1

求出 5位数中的所有 Lily Number。

2.设计要求

输入描述:

输出描述:

一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。

3.思路

  以此为例讲解变种水仙花数(1461 = 1*461 + 14*61 + 146*1)

我们都知道%10能求出一个数的一位,/10能去掉一位。

146(1461/10)   1(1461%10)

14(1461/100)   61(1461%100)

1(1461/1000)   461(1461%1000)

4.代码源

#include <stdio.h>
int main()
{
    int i = 0;
    for(i=10000; i<=99999; i++)
    {
        //判断i是否为lily number
        int j = 10;
        int sum = 0;
        int tmp = i;
        for(j=10; j<=10000; j*=10)
        {
            sum += (tmp%j)*(tmp/j);
        }
        if(sum == i)
            printf("%d ", i);
    }
    return 0;
}

78c72ad15b0847ebb633f62e9912d60c.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗小温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值