题解 | 水仙花数
水仙花数
https://www.nowcoder.com/practice/dc943274e8254a9eb074298fb2084703
#include <iostream>
#include <cmath>
using namespace std;
bool ShuiXianHua(int n)
{
int g=n%10;
int s=n/10%10;
int b=n/100%10;
return(g*g*g+s*s*s+b*b*b==n);
}
int main()
{
int m=0;
int n=0;
while(cin>>m>>n)
{
bool f=1;
bool has=0;
for(int i=m;i<=n;i++)
{
if(ShuiXianHua(i))
{
has=1;
if(f)
{
cout<<i;
f=0;
}
else
cout<<" "<<i;
}
}
if(has)
cout<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
这题我在输出方式上卡了好久,最重要的是控制输出的形式,有考虑过标志位,但是使用以后发现好像不对劲,后面才在提示下想到用两个标志位来解决。刚开始从输入的范围开始判断是否是水仙花数,因为如果接下来有很多个水仙花数,那么输出的时候要留空格,如果一个都没有,那就直接输出no。考虑到题目有多组输入,并且如果输入的范围里面有多个输出的时候,第一个是直接输出就可以的,但是后序输出的需要控制输出空格。所以当判断第一个数得到水仙花数以后,就把标志位置has(有水仙花数)为1,接着再去判断这个是第几个水仙花数,如果是第一个,那就直接输出i就可以了,接下来,把标志位置f 给重置为0,这样后序输出的水仙花数就走else去先输出一个空格,再输出i ,所以从这里可以看出,初始化的时候,判断是否为第一个水仙花数的标志位需要初始化为1,因为它是在进入判断,判断为是水仙花数以后生效,这个时候对于第一个水仙花数,就要把它输出。
最后,对于每轮输入的范围,我们已经完成了:在判断到数字为水仙花数的时候将其逐个输出;所以接下来在每轮输出完以后,只需要再控制输出换行和该输入范围内没有水仙花数时的格式输出即可。

