题解 | #变种水仙花# 【C语言实现】
分步解析:
-
首先看到的是最外层的for循环,从10000 ~ 99999,表示一个五位数的范围
-
接下去是判断的逻辑,分为两部分,具体思路如下:
- 第一块是求解当前数字的位数,封装为
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
- 第一块是求解当前数字的位数,封装为
-
因为我前面使用的是变量
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;
}
运行结果:
#算法面试题##刷题记录#