链接
1116
题面
Description | ||
如果一个n位数的每个数位的n次方和就是本身,那么我们称这种数为“水仙花数”。比如371,33+73+13=27+343+1 = 371。现给你一个数,请求这个数是否是水仙花数。 输入 有多组样例。每个样例占一行,为一个整数a(1<=a <=1,000,000),如果a为 0,那么表示输入结束,这个样例不需要处理。 输出 每行输出一个样例的结果,如果是就输出“Yes”,否则输出“No”。 | ||
Sample Input | ||
1 370 371 600000 700000 0 | ||
Sample Output | ||
Yes Yes Yes No No |
代码
#include<iostream>
#include<cmath>
using namespace std;
int length(int a)
{
int res=0;
while(a)
{
a/=10;
res++;
}
return res;
}
int main()
{
int n;
while(scanf("%d",&n),n!=0)
{
int temp=n;
int len=length(n);
int x=0;
int ans=0;
for(int i=0;i<len;i++)
{
x=n%10;
ans+=pow(x,len);
n/=10;
}
if(ans==temp) printf("Yes\n");
else printf("No\n");
}
return 0;
}
总结
1.读题的时候最好多读几遍,彻底弄懂题目的意思,这道题目的意思是每一个数位的x次方的和等于这个数本身的数称为水仙花数,开始没有仔细读题,误以为每个数位的数字a的a次方的和等于这个数字本身的数称为水仙花数
2.根据题意,我们需要先求一个十进制数字的数位,是一个算法模板
int length(int a)
{
int res=0;
while(a)
{
a/=10;
res++;
}
return res;
}
3.输入十进制数字
4.后续会对输入的数字n进行操作,所以先用一个临时变量保存输入的数字n
int temp=n;
用变量len保存数字的位数,循环len次,然后求和
5.需要注意的是这里涉及到一些强制类型转换,没有操作好可能会导致因为精度的原因的错误
6.调用pow函数,所以使用cmath头文件,pow函数的返回值的数据类型是double型,我们这里把所有的变量都定义为了int型,所以强制转换成了int型,十进制分离一个数字的每一个数位是一个模板,是循环+取模+除法
7.判断答案(和)和临时变量(保存的是输入的数字的值)是否相等