【C语言】从水仙花构建思维

简介: 【C语言】从水仙花构建思维

前言

🎈大家好,我是何小侠🎈

🍃大家可以叫我 小何或者小侠🍃

💐希望能通过写博客加深自己对于学习内容的理解💐

🌸也能帮助更多人理解和学习🌸

击石乃有火,不击元无烟。

人学始知道,不学非自然。

万事须己运,他得非我贤。

青春须早为,岂能长少年。 — 唐代·孟郊《劝学》


    这篇博客我们一起来学习一下有关于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<stdio.h>
    #include<math.h>
    int 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 <stdio.h>
    #include<math.h>
    int 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<stdio.h>
    #include<math.h>
    int main()
    {
      int n = 0;
      for (n = 1; n <= 100000; n++)
      {
        int tmp = n;
        int count = 0;//位数
        //判断出是几位位数
        while (tmp)//123    12   1  
        { 
          tmp /= 10;  //12    1     0
          count++;  
        }
        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循环之外。

    总结🍊

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

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

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



    目录
    相关文章
    |
    1月前
    |
    存储 自然语言处理 编译器
    【C语言】编译与链接:深入理解程序构建过程
    【C语言】编译与链接:深入理解程序构建过程
    |
    6月前
    |
    C语言
    C语言---自幂数(“水仙花数”)
    C语言---自幂数(“水仙花数”)
    79 0
    |
    C语言
    C语言之水仙花数的求解与二维数组结合,使用函数调用
    C语言之水仙花数的求解与二维数组结合,使用函数调用
    |
    29天前
    |
    C语言
    顺序表数组法构建(C语言描述)
    如何使用C语言通过数组方法构建有序顺序表,包括顺序表的创建、插入、删除和打印等。
    16 2
    |
    6月前
    |
    算法 C语言
    C语言 0~10000 水仙花数 判断。
    C语言 0~10000 水仙花数 判断。
    48 0
    |
    2月前
    |
    存储 算法 C语言
    C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
    这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
    |
    5月前
    |
    C语言
    C语言实现水仙花数与99乘法表
    C语言实现水仙花数与99乘法表
    |
    5月前
    |
    算法 Java 程序员
    面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
    【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
    64 7
    |
    5月前
    |
    存储 C语言 C++
    【C语言刷题系列】水仙花数的打印及进阶
    【C语言刷题系列】水仙花数的打印及进阶
    |
    5月前
    |
    C语言
    C语言探索:水仙花数的奥秘与计算
    C语言探索:水仙花数的奥秘与计算
    96 0