【解题思路】c语言打印水仙花数

  • 水仙花数的定义

水仙花数一个n位数每个位次上的数字的n次幂之和等于它本身。例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153

由于其性质的形式,从自身出发,又回到了自身,由于这种只钟爱自己的性质,所以我们称其为自恋数(narcissisticnumber)。心理学上有一个名称叫“水仙花情结”,其意思是“自恋狂”,根据上述数的性质,人们把这些数冠以“水仙花”数的美称。

那么,我们如何使用C语言来寻找并打印出0~100000的水仙花数呢?

(一)、先有公式后有天

先将上文对水仙花数的定义转化为数学式子,我们不妨将诸如下图的式子称为“水仙公式”

所有满足水仙花数定义的数字必然可以满足“水仙公式”

那么我们就可以把“水仙公式”翻译成计算机能听懂的语言,让它帮我们筛选计算

(二)、枝分缕解把数拆

观察公式,不难发现,让计算机帮我们计算之前,我们得把“153”“1634”拆成“1”、“5”、“3”“1”、“6”、“3”、“4”这样的单个数作为底数传递给计算机

拆数也简单


我们把 153 % 10,就可以得到其余数,也就是其个位上的数字,3

再把153 / 10,就可以得到其去掉个位后的数字,15

循环往复,我们就可以把153拆开啦

⭐  1除以10的结果为0,而不是0.1,这是由于在C语言中整数除法只保留商的整数部分

⭐在本题中1%10就是1/10后取余数,而1不够除以10,所以取商等于0,根据余数=被除数-除数*商=1-10*0=1,即得余数为1,所以输出1(同理1~9的数字%10都会得到其本身)

(三)、pow来把幂运算

现在我们已经能得到底数了,还需要对应的幂数,并实现 幂运算

c语言中

 实现幂运算的方法有多种,这里我们选择调用pow()函数,因为这样只要包含math.h的头文件就OK了,不用自己创建函数

⭐不过pow()也有缺点,感兴趣的可以看看这篇文章

http://t.csdnimg.cn/X4N6O

观察pow函数的格式,我们已经有 x (底数)了,还需要 y (幂数)

水仙公式中, y 即是一个数的位数,比如 153  y 31634  y 4

这里我们直接上代码

假设我们传递给weishu函数n参数为153 和 5

好的,能跑

(四)、函数递归再求和

不知道你还记得上文的拆数环节吗?
我们对n/10,再对(n/10)/10.......
n%10,再对(n%10)%10.......

如果说n是爹,那么(n/10)就是 儿子((n/10)/10)就是 孙子

但无论是还是儿子,我们对他们做的处理都是相同的,先%10,再/10

像这样把一个问题层层分化为小问题,并且对这些问题做相似的处理时,我们就可以考虑函数递归

假设我们传递给SUM函数n参数为153 和 5, cnt参数为 3 和 1

ok,能跑

(五)、机甲合体再判断

夜鹭君人生第一个乐高是擎天柱大哥
拼乐高都是一个部位一个部位拼的,先拼头,再拼胸,再拼腿,最后再把这些部位组装起来“合体”

我们写代码也一样,也是分部处理,最后再“合体”

我们把 计算位数CNT和计算幂运算总和的函数SUM拼起来,最后加上判断就ok了

(六)、结语

这是作者第一次做知识类的文章,因为是分享解题思路,所以尽可能写的比较详细(比较婆妈
不过写博客就是在不断的摸索与改进中才能形成自己的风格嘛,所以如果各位有什么建议的话欢迎提出来哦~

最后,感谢各位的观看,祝你有美好的一天 :-)

  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值