杭电ACM 2010水仙花数

2024-11-21 20:49:02
推荐回答(4个)
回答(1):

#include

int main()
{
int b, l, c, i;
int a[] = {1, 153, 370, 371, 407};

while (scanf("%d%d", &b, &l) != EOF)
{
c = 0;
for (i = 0 ; i < 5 ; i++)
{
if (a[i] >= b && a[i] <= l)
printf(c++ ? " %d" : "%d", a[i]);
}
printf(c ? "\n" : "no\n");
}

return 0;
}
这个是正确答案,算法效率比较高,已提交过,accepted

回答(2):

while(m<=n)
改用FOR语句,给M赋100开始,你的问题就出在这里

回答(3):

这位是刚开始搞ACM的吧,这边有三个错误,但是都不是其他两位回答的,
第一个是基本知识,提交ACM题目主函数要命名为int型,并且结尾要加return 0;
第二个是逻辑错误,当你每次重新打入m,n时,你的水仙花个数都要给它清零,也就是d要再输入后清零。
最后是输出问题,仔细看看输出要求,“则要求从小到大排列在一行内输出,之间用一个空格隔开;”
也就是你输出的最后一个数后面是没有空格的,这里我用了一个判断来实现,当d=0时,也就是第一次输出时,我的数字前面没空格,之后输出空格再输出数字。
#include
int main()
{
int m,n,a,b,c,d;
while(scanf("%d %d",&m,&n)!=EOF)
{
d=0; //每次输入要初始化个数。
while(m<=n)
{

a=m%10;
b=(m%100)/10;
c=m/100;
if(a*a*a+b*b*b+c*c*c==m)
{
if(d==0) printf("%d",m);
else printf(" %d",m);
d++;
}
m++;
}
if(d==0) printf("no\n");
else printf("\n");
}
return 0;
}
这个直接提交就能过,刚提交了下

回答(4):

先算最高位c,再求b
b=(m-c*100)/10;
这是我原来用C++写的,你改成c吧!
#include
using namespace std;
int main()
{ int m,n,x,y,z;
cin>>m>>n;
int flag=0;
for(int i=m;i<=n;i++)
{
x=i/100;
y=(i-x*100)/10;
z=i%10;
if(i==x*x*x+y*y*y+z*z*z)
{
cout< flag=1;
}
}
if(!flag)
{
cout<<"no"< }

return 0;
}