学习C语言:自幂数最通俗讲解

今天在B站学习C语言的基础,出了道题目是自幂数,觉得很意思。对于这道题,我觉得是:没想明白之前简直一团乱麻,想明白了之后就出奇的简单了。现在我分享一下我的做题过程,算是自己整理的一些笔记吧,主要是为了记录自己学习过程的中一些片段,希望各位读者不要笑话呀!

什么是自幂数?

如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和,则称此数为自幂数。
例如:在十进制中,153是一个三位数,各个数位的3次幂之和为1^3+5^3+3^3=153,所以153是十进制中的自幂数。–摘自《百度百科》

求解思路

对于这个题目中,其实不难理解我们需要做以下三件事:

  1. 求出给出数字的位数

    小编认为这也这个题目的难点所在,但是一旦想明白了就很简单。我们可以每次除以10,然后当得出的商小于0时,说明已经到了最前一位了,中间新建一个变量n++,作为计数器,得数字出位数。(while循环中,等于0是会跳出不执行,其余情况都是会执行的,所以我们可以直接写tmp/10)

            while (tmp / 10)//tmp是我们要求证是否是水仙花的数字
            {
                n++;
                tmp = tmp / 10;
            }
    
  2. 对每位数字给出对应的次方

    这一步中我们需要用到一个math.h的头文件,这文件中有直接次方计算的函数pow,直接调用比较简单。其中pow(m,n),m代表被乘方数,n代表次方数。接着我们用模可以取余的方法就能拿到每位数。拿到一位数除一次10,方便取下一位

            while (tmp)//tmp是我们要求证是否是水仙花的数字
            {
                sum += pow(tmp % 10,n);
                tmp = tmp / 10;
            }
    
  3. 求证次方和是否等于原数字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的值其实已经改变了,因此这里要给零时变量。

小编碎碎念:之前觉得写代码是一件很酷的事情,但是真正走上了这条路之后,才发现这条路其实枯燥无比,但是老话说的好,自己选择的路哭着也要走完。所以希望在条路的小伙伴们,我们一起加油,愿他日我们也能小白化身大佬,成为自己最初想要成为的样子!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值