当前位置:
文档之家› 21位水仙花数算法(C++实现)
21位水仙花数算法(C++实现)
通过计算我们容易知道,9 的 21 次方为一个 21 位数(109418989131512359209), 因此,在这个 21 位数当中 9 最多只能出现 9 次。 128468643043731391252 449177399146038697307
#include<iostream> #define N 21
for(int m = 1;m <= cot[l]; ++m) {
for(int n = 0;n < N; ++n) {
add[n] += arr[l][n]; while(add[n] > 9) {
add[n] -= 10;
add[n + 1]++; } }
} } //判断得到的和是不是一个 21 位数 if(0 == add[N - 1]) continue;
for(cot[5] = 0;cot[5] <= N - cot[9] - cot[8] - cot[7] - cot[6]; ++cot[5]) {
for(cot[4] = 0;cot[4] <= N - cot[9] - cot[8] - cot[7] - cot[6] - cot[5]; ++cot[4])
//计数和中每个数字出现的次数 for(int o = 0;o < N; ++o) {
cota[add[o]]++; }
//将和中每个数字出现的次数与该数中每个 数字出现的次数进行比较
int flag = 1; for(int p = 0;p < 10; ++p) {
if(cot[p] != cota[p]) {
一个 N 位的十进制正整数,如果它的每个位上的数字的 N 次方的和等于这个数本身,则称 其为花朵数。 例如: 当 N=3 时,153 就满足条件,因为 1^3+5^3+3^3=153,这样的数字也被称为水仙花数(其中, “^”表示乘方,5^3 表示 5 的 3 次方,也就是立方)。 当 N=4 时,1634 满足条件,因为 1^4+6^4+3^4+4^4=1634. 当 N=5 时,92727 满足条件。 实际上,对 N 的每个取值,可能有多个数字满足条件。 程序的任务是:求当 N=21 时,所有满足条件的水仙花数。注意:这个整数有 21 位, 它的各个位数字的 21 次方之和正好等于这个数本身。 如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。 因为这个数字很大,请注意解法时间上的可行性。要求程序在 3 分钟内运行完毕。
- cot[4] - cot[3] - cot[2] - cot[1]; int cota[10],add[N];
for(int j = 0;j < N; ++j) {
add[j] = 0; } for(int k = 0;k < 10; ++k) {
cota[k] = 0; }
//求该数的每个位上的数字的 N 次方的和 for(int l = 0;l < 10; ++l) {
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) {
解题思路: 这是一个组合问题。这个 21 位的数字是由 0~9 这十个数字组成的,先统计出该数字
中每个数字出现的个数,然后求出各个位上数字的 21 次方之和(可用查表法),并统计出和 中每个数字出现的个数,将每个数字在这个 21 位数中和在和中出现的次数进行比较,若所 有的数字出现的次数均相同,则此时的 21 位数就是一个水仙花数,将其输出。
flag = 0; break; } } //当该数不符合要求时执行下一次循环,不输 出该数 if(0 == flag) continue; for(int q = N - 1;q >= 0; --q) cout<<add[q]; cout<<endl; } } } } } } } } } return 0; }
d = a % 10; arr[x][N - (e--)] = d; a = awhile(b) {
d = b % 10; arr[x][N - (e--)] = d; b = b / 10; }
e = N;
while(c) {
d = c % 10; arr[x][N - (e--)] = d; c = c / 10; } }
{ for(cot[3] = 0;cot[3] <= N - cot[9] - cot[8] - cot[7] - cot[6] - cot[5]
- cot[4]; ++cot[3]) { for(cot[2] = 0;cot[2] <= N - cot[9] - cot[8] - cot[7] - cot[6] -
//该函数用来求 x 的 21 次方,并将所求结果存储在数组 arr[x]中 void fang(int x) {
long int a = 0,b = 0,c = 1; for(int i = N;i > 0; --i) {
c = c * x; a = a * x; b = b * x; while(b > 9999999) {
using namespace std;
void fang(int x); int arr[10][21];
int main() {
int cot[10];
for(int i = 0;i < 10; ++i) {
cot[i] = 0; fang(i); }
//生成一个 N 位数并计数该数中每个数字出现的次数 for(cot[9] = 0;cot[9] <= 9; ++cot[9]) {
cot[5] - cot[4] - cot[3]; ++cot[2]) { for(cot[1] = 0;cot[1] <= N - cot[9] - cot[8] - cot[7] -
cot[6] - cot[5] - cot[4] - cot[3] - cot[2]; ++cot[1]) { cot[0] = N - cot[9] - cot[8] - cot[7] - cot[6] - cot[5]
for(cot[8] = 0;cot[8] <= N - cot[9]; ++cot[8]) {
for(cot[7] = 0;cot[7] <= N - cot[9] - cot[8]; ++cot[7]) {
for(cot[6] = 0;cot[6] <= N - cot[9] - cot[8] - cot[7]; ++cot[6]) {