1、一个 N 位的十进制正整数,如果它的每个位上的数字的 N 次方的和等于这个数本身,则称其为花朵数。例如:当 N=3 时,153 就满足条件,因为 13+53+33=153,这样的数字也被称为水仙花数(其中, “”表示乘方, 53 表示 5 的 3 次方,也就是立方) 。当 N=4 时,1634 满足条件,因为 14+64+34+44=1634.当 N=5 时,92727 满足条件。实际上,对 N 的每个取值,可能有多个数字满足条件。程序的任务是:求当 N=21 时,所有满足条件的水仙花数。注意:这个整数有 21 位,它的各个位数字的 21 次方之和正好等于这个数本身。如果满足条件的数字不只有一
2、个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在 3 分钟内运行完毕。解题思路:这是一个组合问题。这个 21 位的数字是由 09 这十个数字组成的,先统计出该数字中每个数字出现的个数,然后求出各个位上数字的 21 次方之和(可用查表法) ,并统计出和中每个数字出现的个数,将每个数字在这个 21 位数中和在和中出现的次数进行比较,若所有的数字出现的次数均相同,则此时的 21 位数就是一个水仙花数,将其输出。通过计算我们容易知道,9 的 21 次方为一个 21 位数(109418989131512359209) ,因此,在这个 21 位数
3、当中 9 最多只能出现 9 次。128468643043731391252449177399146038697307#include#define N 21using namespace std;void fang(int x);int arr1021;int main()int cot10;for(int i = 0;i 9)addn -= 10;addn + 1+;/判断得到的和是不是一个 21 位数if(0 = addN - 1) continue;/计数和中每个数字出现的次数for(int o = 0;o = 0; -q)cout 0; -i)c = c * x;a = a * x;b = b * x;while(b 9999999)b -= 10000000;a += 1;while(c 9999999)c -= 10000000;b += 1;while(b 9999999)b -= 10000000;a += 1;int d;int e = N - 14;while(a)d = a % 10;arrxN - (e-) = d;a = a / 10;e = N - 7;while(b)d = b % 10;arrxN - (e-) = d;b = b / 10;e = N;while(c)d = c % 10;arrxN - (e-) = d;c = c / 10;