水仙花数 HDU-2010

水仙花数 HDU-2010
Problem Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
 

Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
 

Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
 

Sample Input
  
  
100 120 300 380
 

Sample Output
no370 371

第一次尝试:
#include <stdio.h>
#include <math.h>
int main()
{
    int m,n;
    while (scanf("%d%d",&m,&n)!=EOF)
    {
        int a=0,s[1000];
        for(int x=m;x<=n;x++)
        {              
            if(x==pow(x/100,3)+pow((x/10)%10,3)+pow(x%10,3))
            {
                s[a]=x;
                a++;
            }    
        }
        if(s[0]=='\0')printf("no\n");
            else 
            {
                for(int j=0;j<a-1;j++)printf("%d ",s[j]);
                printf("%d\n",s[a-1]);    
            }
    }
    return 0;

注意:三位数x,提取百位数:x/100,提取十位数:x/100%10,提取个位数:x%10。

上面的代码是错误的,因为当这是X中不存在水仙花数时,数组是s[]中没有储存数字,那么其中内容就是随机分配的,s[0]不一定就是'\0',这要取决于及计算机分配给他一个随机数,那么最后输出的结果就不是no,而是一个随即大的数。在数组中'\0'是结束标志,一般在存储信息的后一个中分配'\0'表示结束,因此这里不能用'\0'作为判断条件,而应该用a来判断。

正确代码:
#include <stdio.h>
#include <math.h>
int main()
{
    int m,n;
    while (scanf("%d%d",&m,&n)!=EOF)
    {
        int a=0,s[1000];
        for(int x=m;x<=n;x++)
        {              
            if(x==pow(x/100,3)+pow((x/10)%10,3)+pow(x%10,3))
            {
                s[a]=x;
                a++;
            }   
        }
        if(a==0)printf("no\n");
            else 
            {
                for(int j=0;j<a-1;j++)printf("%d ",s[j]);
                printf("%d\n",s[a-1]);  
            }
    }
    return 0;

帝的代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF){
        int temp=0;
        for(int i=m;i<=n;i++){
            if((i/100)*(i/100)*(i/100)+(i%100/10)*(i%100/10)*(i%100/10)+(i%10)*(i%10)*(i%10)==i){
                if(temp==0)
                    printf("%d",i);
                else
                    printf(" %d",i);
                temp=1;
            }
        }
        if(temp==0)
            printf("no");
        printf("\n");
    }
    return 0;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值