前言
大家好,我是何小侠
大家可以叫我 小何或者小侠
希望能通过写博客加深自己对于学习内容的理解
也能帮助更多人理解和学习

击石乃有火,不击元无烟。
人学始知道,不学非自然。
万事须己运,他得非我贤。
青春须早为,岂能长少年。 — 唐代·孟郊《劝学》


    这篇博客我们一起来学习一下有关于C语言中常见题目水仙花的思维,这对我们刷题时有一个清晰的思路很有帮助。

    目录

    • 最简单的水仙花
    • 水仙花进阶
    • 变种水仙花
    • 总结

    最简单的水仙花


    我们需要打印出所有的水仙花数,并且一个数占一行,我们会怎么打印呢?
    如果我们是初学者可能会这样

    int main() {int i = 0;for (i = 100; i <= 999; i++){int a = i % 10;int b = i / 10 % 10;int c = i / 100 % 10;if (a * a * a+ b * b * b + c * c * c == i){printf("%d\n", i);}}return 0;}

    但是这样能让我们学习到的方法很少。

    我们换一种方法借用pow函数

    #include#includeint main() {int i = 0;for (i = 100; i <= 999; i++){if ( pow(i%10, 3) + pow(i / 10 % 10, 3) + pow(i / 100 % 10, 3) == i){printf("%d\n", i);} }return 0;}


    有人就要说了,pow的参数和返回值都是double,我们可以直接使用吗?
    pow函数的参数可以是double类型,但是也可以是int类型。当参数为int类型时,会自动将int类型转换为double类型,然后进行计算。这就是表达式中的隐式转换。这里我们判断一下if的表达式都转换为double来最后进行判断

    水仙花进阶


    我们来看看这个题就明显可以用我们上面的pow函数,当然思路也不算太难,主要是要学会运用。

    #include #includeint main() { int m = 0; int n = 0; int flag = 0; while(~scanf("%d %d",&m,&n)) { int i = 0; for (i = m; i <= n; i++) { if ( pow(i % 10,3) + pow(i / 10 % 10,3) + pow(i / 100 ,3) == i){printf("%d ", i);flag++;} } if (flag == 0) {printf("no\n"); } flag = 0;}return 0;}

    这个代码的小细节有scanf多组输入时候的一种写法,
    因为scanf返回的是你输入值的个数,简单点来说,就是你有几个&就返回几。我们知道~是按位取反,我们正常其实是这样写 while(scanf("%d %d",&m,&n)!=EOF),我们知道EOF是-1,而-1的补码全是1,那么取法后就等于0,等于0的时候刚好也就退出循环。

    还有一个比较要注意的是我们判断输出no之后也需要把flag 变成0,以便于多组输入的正确性

    变种水仙花

    最后是这个题目我们怎么来看呢?

    说一说思路:
    我们肯定是在 0-100000这个范围里面循环,我们再想一想之前我们判断三位数的时候是怎么做的,用pow(base,exponent),base是底数,exponent是幂,我们的base很好变化,那么我们的幂怎么决定呢?
    我们看题目,“水仙花数”是一个n位数,其各位数字的n次方等于该数本身。
    那么我们就需要判断这个数是几位数。

    下面给出代码

    #include#includeint main(){int n = 0;for (n = 1; n <= 100000; n++){int tmp = n;int count = 0;//位数//判断出是几位位数while (tmp)//12312 1{ tmp /= 10;//121 0count++;}tmp = n;//n不能被改变因为下面还要比较//计算n次方之和int sum = 0;//各数位相加while ( tmp ){sum += (int)(pow(tmp % 10, count));tmp /= 10;//每次减少一位数}if (sum == n){printf("%d", sum);}}return 0;}

    这个代码主要是要记住n不能被改变,因为最后的 if ( )还需要比较,还有求位数后tmp的值就变成0了,为了下次还能够使用,我们必须再tmp =n ;
    ,最后像count,sum,这两个变量的创建位置一定要能在第二次也能够使用,所以不能创建在for循环之外。

    总结

    这篇博客写的东西并不是太难,主要是想总结一下水仙花这一类型 题目,
    最重要的我觉得还是变种水仙花。这篇博客这里就结束了。

    最后如果这篇博客有帮助到你,欢迎点赞关注加收藏


    如果本文有任何错误或者有疑点欢迎在评论区评论