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

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

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

在这里插入图片描述


    这篇博客我们一起来学习一下有关于C语言中常见题目水仙花的思维,这对我们刷题时有一个清晰的思路很有帮助。
    【C语言】从水仙花构建思维_第1张图片

    目录

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

    最简单的水仙花

    【C语言】从水仙花构建思维_第2张图片
    我们需要打印出所有的水仙花数,并且一个数占一行,我们会怎么打印呢?
    如果我们是初学者可能会这样

    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
    #include
    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来最后进行判断

    水仙花进阶

    【C语言】从水仙花构建思维_第3张图片
    我们来看看这个题就明显可以用我们上面的pow函数,当然思路也不算太难,主要是要学会运用。

    #include 
    #include
    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,以便于多组输入的正确性

    变种水仙花

    【C语言】从水仙花构建思维_第4张图片

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

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

    下面给出代码

    #include
    #include
    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循环之外。

    总结

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

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

    【C语言】从水仙花构建思维_第5张图片【C语言】从水仙花构建思维_第6张图片
    如果本文有任何错误或者有疑点欢迎在评论区评论
    在这里插入图片描述

    你可能感兴趣的:(C语言,c语言,笔记,经验分享)