前言
🎈大家好,我是何小侠🎈
🍃大家可以叫我 小何或者小侠🍃
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸
击石乃有火,不击元无烟。
人学始知道,不学非自然。
万事须己运,他得非我贤。
青春须早为,岂能长少年。 — 唐代·孟郊《劝学》
这篇博客我们一起来学习一下有关于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循环之外。
总结🍊
这篇博客写的东西并不是太难,主要是想总结一下水仙花这一类型 题目,
最重要的我觉得还是变种水仙花。这篇博客这里就结束了。
最后如果这篇博客有帮助到你,欢迎点赞关注加收藏
如果本文有任何错误或者有疑点欢迎在评论区评论