题解 | #变种水仙花# 【C语言实现】

分步解析:

  1. 首先看到的是最外层的for循环,从10000 ~ 99999,表示一个五位数的范围

  2. 接下去是判断的逻辑,分为两部分,具体思路如下:

    • 第一块是求解当前数字的位数,封装为Count_Num()函数
    • 第二块是累加当前数字拆分后的乘积,因为2位数统计1次,3位数统计2次,4位数统计3次,所以我们可以使用上面计算出来的数字位数来进行计算。接下去便是如何分割的逻辑,这里可以用到取余%和整除/来进行控制,上面在计算数字位数的时候也是如此,不过我们要分割好几次,但每一次都是在原数的基础上分割的,所以要拿一个临时变量tmp来记录一下,我们对tmp进行操作即可
    • 至于该如何去进行分割,这是有规律的,以【1461】为例,有三种分割方式,即146和1、14和61、1和461,但是要怎么通过取余%和整除/来进行控制呢?你仔细数一下它们的位数,为3 1、2 2、1 3,每一种可能的和都是这个数字本身的位数,所以我们便可以通过位数和当前循环变量j来进行控制,但是不要忘记了在后面的数被分割完后使用整除/哦,否则前面的数就不准确了
    • 最后的话将计算出来的【front】和【after】做一个乘积然后累加到变量sum中去就可以了,直到所有的可能性都累加完返回sum
  3. 因为我前面使用的是变量t在进行运算,所以此刻的i还没有发生改变,因此我们拿上面计算出来的【sum】与【i】去进行一个比较即可,若是相同的话它就是一个Lily Number

整体代码:

#include <stdio.h>
#include <math.h>

//计算数字的位数
int Count_Num(int num)
{
    int n = 0;
    do
    {
        num /= 10;
        n++;
    } while (num);
    return n;
}

//计算单个数分割后的乘积
int CalSum(int num, int digit)
{
    int sum = 0;
    for (int j = 1; j <= digit - 1; ++j)
    {
        int tmp = num;
        int tt1 = pow(10, j);
        int tt2 = pow(10, digit - j);
        int after = tmp % tt1;
        tmp /= tt1;     //取余后进行分割
        int front = tmp % tt2;

        sum += (front * after);
    }
    return sum;
}
int main(void)
{
    for (int i = 10000; i < 99999; ++i)
    {
        int t = i;
        int count = Count_Num(t);       //获取当前数字的位数

        int sum = CalSum(t, count);
        if (sum == i)
            printf("%d ", i);
    }
    return 0;
}

后续优化的版本,发现前面的数不需要进行取余,直接整除/就可以做到

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;
}

运行结果:

alt

#算法面试题##刷题记录#
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务