水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例 如:153 = 13 + 53+ 33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3<=N<=7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:3输出样例:
153 370 371 407
#include <stdio.h> #include <string.h> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <cctype> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <deque> #include <queue> #include <set> #include <list> #include <map> #include <string> using namespace std; int main() { int i,n,s[10],t,sum; cin >>n; for(i=0;i<=9;i++) //减少了计算时间 { s[i]=pow(i,n); } for(i=pow(10,n-1);i<pow(10,n);i++) { t=i; sum=0; while(t) { sum+=s[t%10]; t=t/10; } if(sum==i) cout <<i <<endl; } return 0; }
方法二:
#include <stdio.h> #include <string.h> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <cctype> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <deque> #include <queue> #include <set> #include <list> #include <map> #include <string> using namespace std; int main() { int n,i,j,l,sum; char s[10]; cin >>n; if(n==7) { printf("1741725\n"); printf("4210818\n"); printf("9800817\n"); printf("9926315\n"); return 0; } for(i=(int)(pow(10,n-1));i<(int)(pow(10,n));i++) { sum=0; sprintf(s,"%d",i); l=strlen(s); for(j=0;j<l;j++) sum+=(int)(pow(s[j]-'0',n)); if(sum==i) printf("%d\n",sum); } return 0; }