-
水仙花数的定义
水仙花数:一个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()也有缺点,感兴趣的可以看看这篇文章
观察pow函数的格式,我们已经有 x (底数)了,还需要 y (幂数)
水仙公式中, y 即是一个数的位数,比如 153 的 y 是 3,1634 的 y 是 4
这里我们直接上代码
假设我们传递给weishu函数的n参数为153 和 5
好的,能跑
(四)、函数递归再求和
不知道你还记得上文的拆数环节吗?
我们对n/10,再对(n/10)/10.......
对n%10,再对(n%10)%10.......
如果说n是爹,那么(n/10)就是 n 的儿子,((n/10)/10)就是 n 的孙子
但无论是爹还是儿子,我们对他们做的处理都是相同的,先%10,再/10
像这样把一个问题层层分化为小问题,并且对这些问题做相似的处理时,我们就可以考虑函数递归
假设我们传递给SUM函数的n参数为153 和 5, cnt参数为 3 和 1
ok,能跑
(五)、机甲合体再判断
夜鹭君人生第一个乐高是擎天柱大哥
拼乐高都是一个部位一个部位拼的,先拼头,再拼胸,再拼腿,最后再把这些部位组装起来“合体”
我们写代码也一样,也是分部处理,最后再“合体”
我们把 计算位数CNT和计算幂运算总和的函数SUM拼起来,最后加上判断就ok了
(六)、结语
这是作者第一次做知识类的文章,因为是分享解题思路,所以尽可能写的比较详细(比较婆妈)
不过写博客就是在不断的摸索与改进中才能形成自己的风格嘛,所以如果各位有什么建议的话欢迎提出来哦~
最后,感谢各位的观看,祝你有美好的一天 :-)