当前位置: 代码迷 >> 综合 >> 【51Nod - 1015 】水仙花数
  详细解决方案

【51Nod - 1015 】水仙花数

热度:2   发布时间:2023-12-06 19:46:46.0

水仙花数是指一个 n 位数 ( n >= 3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)

给出一个整数M,求 >= M的最小的水仙花数。

Input

一个整数M(10 <= M <= 1000)

Output

输出>= M的最小的水仙花数

Sample Input

99

Sample Output

153

题意好懂的中文题,感觉自己写的麻烦了。。。

ac代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<cstring> 
#include<string.h>
#include<queue>
using namespace std;
typedef long long ll;
int s[5000];
int qsm(int a,int b)
{int t=1;while(b){if(b&1)t*=a;a*=a;b>>=1;}return t;
}
int cal(int t)
{int ans=0;int num=t;int n=0;while(num){num/=10;n++;}num=t;while(t){ans+=qsm(t%10,n);t/=10;}return ans==num;
}
int main()
{int cnt=0;for(int i=0;i<3000;i++){if(cal(i)){s[cnt++]=i;}}int m;scanf("%d",&m);printf("%d\n",*lower_bound(s,s+cnt,m));return 0;} 

看了别人的代码发现,其实直接找出那几个数判断就好,本来数据范围就不大。

来自:https://www.cnblogs.com/qhy285571052/p/36cebc009dc194f5bc566b130086c662.html

#include<stdio.h>
using namespace std;
int main(){int m;scanf("%d",&m);if(m > 407){puts("1634");}else if(m > 371){puts("407");}else if(m > 370){puts("371");}else if(m > 153){puts("370");}else puts("153");
}