今天在B站学习C语言的基础,出了道题目是自幂数,觉得很意思。对于这道题,我觉得是:没想明白之前简直一团乱麻,想明白了之后就出奇的简单了。现在我分享一下我的做题过程,算是自己整理的一些笔记吧,主要是为了记录自己学习过程的中一些片段,希望各位读者不要笑话呀!
什么是自幂数?
如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和,则称此数为自幂数。
例如:在十进制中,153是一个三位数,各个数位的3次幂之和为1^3+5^3+3^3=153,
所以153是十进制中的自幂数。–摘自《百度百科》
求解思路
对于这个题目中,其实不难理解我们需要做以下三件事:
-
求出给出数字的位数
小编认为这也这个题目的难点所在,但是一旦想明白了就很简单。我们可以每次除以10,然后当得出的商小于0时,说明已经到了最前一位了,中间新建一个变量n++,作为计数器,得数字出位数。(while循环中,等于0是会跳出不执行,其余情况都是会执行的,所以我们可以直接写tmp/10)
while (tmp / 10)//tmp是我们要求证是否是水仙花的数字 { n++; tmp = tmp / 10; }
-
对每位数字给出对应的次方
这一步中我们需要用到一个math.h的头文件,这文件中有直接次方计算的函数pow,直接调用比较简单。其中pow(m,n),m代表被乘方数,n代表次方数。接着我们用模可以取余的方法就能拿到每位数。拿到一位数除一次10,方便取下一位
while (tmp)//tmp是我们要求证是否是水仙花的数字 { sum += pow(tmp % 10,n); tmp = tmp / 10; }
-
求证次方和是否等于原数字n,如果是那么则说明是自幂数
if (sum == i) { printf("%d是水仙花数\n",i); }
上面就是求解自幂数的过程,下面是完整代码:
# include <math.h>
# include <stdio.h>
int main()
{
int i = 0;
for ( i = 0; i < 10000; i++)
{
int n = 1;//数字的位数为n
int tmp = i;//临时变量tmp
while (tmp / 10)
{
n++;
tmp = tmp / 10;
}
tmp = i;
int sum = 0;
while (tmp)
{
sum += pow(tmp % 10,n);
tmp = tmp / 10;
}
if (sum == i)
{
printf("%d是水仙花数\n",i);
}
}
return 0;
}
看了上面的完整代码,就有一个问题需要特别注意,小编自己妥妥的踩坑了。问题是我们需要给出零时变量!原因很简单,我们在求数字位数的时候,都会对原数字进行操作,那么如果不给零时变量,最后比较我们拿到的i的值其实已经改变了,因此这里要给零时变量。
小编碎碎念:之前觉得写代码是一件很酷的事情,但是真正走上了这条路之后,才发现这条路其实枯燥无比,但是老话说的好,自己选择的路哭着也要走完。所以希望在条路的小伙伴们,我们一起加油,愿他日我们也能小白化身大佬,成为自己最初想要成为的样子!