题目描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如: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;
每个测试实例的输出占一行。
样例输入 Copy
100 120
300 380
样例输出 Copy
no
370 371
提示
在不知道m到n之间有多少个水仙花数的情况下,如何控制两个数之间有空格,而最后一个水仙花数之后没有空格?解决方法之一是:第一个水仙花数之前不加空格,而其后每个水仙花数之前加空格。而通过一个标识变量可以判断出是否是第一个水仙花数。
初做多实例测试,要注意变量赋初值的位置。
我的第一次提交(显示格式错误):
#include<stdio.h>
int narcissus(int i);
int main()
{
int m, n, i, find=0;
while(scanf("%d%d", &m, &n)!=EOF){
for( i=m; i<=n; i++){
if( narcissus(i)==1 ){
find++;//find的位置很重要也是关键
if(find==1)printf("%d", i);
else printf(" %d", i);水仙花数之间加一个空格
}
}
if(find==0)printf("no\n");//多了一个换行符,导致格式错误,去掉该换行符就正确了
printf("\n");处理完每组数据都要换行
find=0;每次循环后都要重新初始化,这样才能保证在处理每组数据find都是从0开始,而在遇到水仙花数find的值都是1
}
return 0;
}
int narcissus(int i)
{
int ge, shi, bai;
ge=i%10,shi=(i/10)%10,bai=i/100;
if( i==ge*ge*ge+shi*shi*shi+bai*bai*bai)
return 1;
return 0;
}
其他比较好的方法(一),巧妙地运用了布尔值
#include <stdio.h>
int main(void)
{
int m,n,i,a,b,c;
while(scanf("%d %d",&m,&n)!=EOF)
{
bool t=0;//用 bool定义 t为一个 “开关 ”,t=0表明开关关上了,t=1表示开关打开了
//注意,这个开关定义在 for循环外面是为了保证每次输入数据的时候,开关都是关着的
for(i=m;i<=n;i++)//i既控制循环次数,又充当从 m到 n的每个数字变量
{
a=i/100;//分解数字的百位
b=(i-a*100)/10;//分解数字的十位
c=i%10;//分解数字的个位
if(i==a*a*a+b*b*b+c*c*c)//如果 i是水仙花数,则可以进行下面花括号中的操作
{
if(t==1) printf(" ");//当第一次输出水仙花数的时候,开关是关上的,所以不会输出空格,
//保证了输出的第一个水仙花前不会出现空格导致Presentation Error
//也保证了如果之后再输出水仙花数,开关会被打开,而会在第二个、第三个……水仙花数之前输出空格
//还保证了不会奇怪的在最后一个水仙花数之后输出空格
printf("%d",i);
t=1;//只要输出过,“开关 ”就打开
}
}
if(t==0) printf("no");//只有满足开关关上,即从来没有输出过水仙花数的时候才可以输出 “no”字符
printf("\n");//每输入输出一次都要换行
}
}
其他的方法二:
#include <stdio.h>
int main(void)
{
int i, j, k, n;
int a, b, p;
while(scanf("%d %d", &a, &b) != EOF)
{
p = 0;//也是运用标志变量,同样标志变量的位置是关键
for(n = a; n <= b; n++)
{
i = n / 100; //分解出百位
j = n / 10 % 10; //分解出十位
k = n % 10; //分解出个位
if (n == i*i*i + j*j*j + k*k*k)
{
if (p == 0)
{
printf("%d", n);
p++;
}
else
printf(" %d", n);
}
}
if (p == 0)
printf("no\n");
else
printf("\n");
}
return 0;
}