今天给大家介绍一道函数题。水仙花数的进阶函数专题。
水仙花数在OJ的题目里也算的上是趣味性比较强,相对难度比较简单的题目了。大家在看本文之前也可以先回顾一下1027:水仙花数的题解。
本题相对难度较高,如果对函数还不够理解的同学可以选择放弃和其他同学一起学习。
1096: 水仙花数(函数专题)
- 题目描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+33。
现在要求输出所有在m和n范围内的水仙花数。
要求程序定义一个narcissus()函数和一个main()函数,narcissus()函数判断一个整数n是否为水鲜花数,其余功能在main()函数中实现。
int narcissus(int n)
{
//判断n是否为水仙花数, 若是函数返回1,否则返回0
}
对于C/C++代码的提交,本题要求必须通过定义narcissus函数和main函数实现,否则,提交编译错误,要提交完整的程序。
- 输入
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
- 输出
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
#include<stdio.h>
int narcissus(int n)
{
int a,b,c;
a = n / 100;
b = n / 10 % 10;
c = n % 10 % 10;
if(n==a*a*a+b*b*b+c*c*c)
return 1;
else
return 0;
}
int main()
{
int m, n, i, find=0;
while(scanf("%d%d", &m, &n)!=EOF){
find=0;
for(i=m; i<=n; i++){
if( narcissus(i)==1 ){
find++;
if(find==1)printf("%d", i);
else printf(" %d", i);
}
}
if(find==0){
printf("no");
}
printf("\n");
}
return 0;
}
- 代码解析:
本题的难度应该不在函数的描写上,而在main()函数对是否存在水仙花数的判断上,下面的解析会有轻重,如果对某段代码不够了解的同学可以直接在下面评论区提出。
- 首先直接从main函数讲起,待需要进行判断水仙花数时再解释函数。
- 根据题目要求,输入数据有多组,则这里明显需要用到循环进行输入,数据有多组说明循环的次数不确定,所以这里适用于1079的多实例例子,如果忘记了的同学可以回顾一下之前的题解。
- 根据题目要求的m,和n分别是区间的两个点,这里要求的是我们找出这个区间内的水仙花数,所以,我们还需要再写一个循环,寻找位于这个区间的水仙花数。
- 既然这里需要寻找水仙花数了,那么就需要我们开始写计算过程了。由于题目是函数专题,我们这里把计算过程写进函数中。这里定义的narcissus() 函数题目要求我们判断:判断n是否为水仙花数, 若是函数返回1,否则返回0。因此,我们在使用与1027同样的判断过程后,让其在输出后再次判断,如果是水仙花数则返回1,如果不是则返回0。
- 函数写完后,我们则要在main函数()中使用他了。根据题目要求我们目的是要输出水仙花数或者输出0。那么我们首先用函数进行判断。因为函数内部已经进行过水仙花数的判断了。我们直接根据判断结果进行输出即可。
- 如果函数返回1,则输出这个数;如果函数全部返回0,则输出no。要注意这两句话的重点。要全部数判断完后再去判断是否没有水仙花数。所以这里我们添加一个参数来作为判断,判断这个区间是否有水仙花数,当我们判断到有一个数是水仙花数了,就把负责记录判断的数+1。
- 待我们所有的数判断完后,如果没有水仙花数,则用来判断的参数find仍为初始值0,判断完输出“no”即可。
注意的易错点:
谈易错点前先给大家看张截图。。。
1.注意空格。每个水仙花数之间要有空格,不能直接连续输出
2.注意判断没有水仙花数一定要在判断水仙花数的循环结束后再判断,不然会重复输出多个no。
3.整个while循环走完后记得加个换行。。。不然会导致下一次区间判断的值与上次重叠导致答案错误。
4.每次判断水仙花数的循环后,判断的值一定要归初始值0。不然会影响下次循环的判断。
这次的教程比较长比较复杂,但也自认相对比较详细了,看完肯定会有不少收获,希望大家都能耐心看完。另外看完后请右下方点个赞支持一下。码字不易~