【C语言】BC91水仙花数(DAY 6)

文章目录

    • 题目概要
    • 解题分析
    • 代码实现
    • 重难分析

题目概要

BC91水仙花数
描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。 现在要求输出所有在m和n范围内的水仙花数。
输入描述:
输入数据有多组,每组占一行,包括两个整数m和n(100 ≤ m ≤ n ≤ 999)。
输出描述:
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开; 如果给定的范围内不存在水仙花数,则输出no; 每个测试实例的输出占一行。
【C语言】BC91水仙花数(DAY 6)_第1张图片

解题分析

题目要求,一个三位数的各位数字的立方和等于其本身,这个就可以作为我们的判断条件,我们不考虑用很高级的表达方法,我们就只用学过的,求余和除。 三次方的表达方式不外乎是自己乘以自己乘以自己。又因为题目已经给出了范围,100~999 所以我们可以直接写变量和循环条件了。

int m=0,n=0,cnt=0;
while(scanf("%d%d",&m,&n)!EOF){

		for(m;m<=n;m++)
		{
				if(((m/100)*(m/100)*(m/100)+(m%100/10)*(m%100/10)*(m%100/10)+(m%10)*(m%10)*(m%10))==m)
				//这句话的意思是 三位数的百位+十位+个位是否等于用户输入的m,如果等于的话,那么m就是水仙花数。
				{
					 printf("%d",m);
					 cnt++;
			 	}
		}
		if(cnt==0)
		{
			printf("no");
		}
		printf("\n");
		}
		return 0;
}

代码实现

#include<stdio.h>
int main()
{
    int m=0,n=0,cnt=0;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        
        for (m;m<=n;m++)
            {
               if(((m/100)*(m/100)*(m/100)+(m%100/10)*(m%100/10)*(m%100/10)+(m%10)*(m%10)*(m%10))==m)
               {
                   printf("%d ", m);
                   cnt++;
                   
               }
            }
        if(cnt==0)
        {
            printf("no");
        }
        printf("\n");
    }
    return 0;
    
}

重难分析

我之前见到水仙花数就跳过,因为总是觉得自己写不出来,但是凡事多问几个为什么。仔细思考发现,就这道题的水仙花数而言,并不是很难想。三位数的范围给出来了,如果不知道函数,大不了就用求余和除法,总能得到一个三位数的各个位数。事实证明确实如此。
声明变量后,就用到了刷题时不少见到的while(sancf("%d",&a)!=EOF) 以前我也觉得很新鲜,自己没有见过这种表达形式,但是练习次数多了,就发现了这种写法。随后就是一个for循环,循环范围就是题目规定的m到n。随后就是判断输入的数字m是否符合水仙花数的特征,也就是各位数字的立方和的和是否等于m。
引用一句老师的话表达学习心态:“计算机中没有什么黑魔法,别人能想出来的我们也可以,只不过是我们现在暂时还不知道罢了。”只要不断学习,总能学会我们以前不会的知识。

你可能感兴趣的:(C语言,#,C语言刷题,c语言,算法,开发语言,蓝桥杯,数据结构)