水仙花数 HDU-2010
Problem Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
如果给定的范围内不存在水仙花数,则输出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;
}