ZZULI-OJ96水仙花数

题目描述

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如: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; 
} 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值