快速寻找9位数内的自幂数

自幂数求解算法

首先了解自幂数的定义,自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为3时,有1 ^ 3 + 5 ^ 3 + 3 ^ 3 = 153,153即是n为3时的一个自幂数)
自幂数包括:独身数、水仙花数、四叶玫瑰数、五角星数、六合数、北斗七星数、八仙数、九九重阳数、十全十美数。
先介绍基本的方法,代码如下:

#include <stdio.h>
#include <time.h>
#include <math.h>

#include "Nmec.h"

boolean isSelfPower(int num);
int intLen(int num);

boolean isSelfPower(int num) {
	int n;
	int len;
	int sum = 0;

	len = intLen(num);
	for (n = num; n; n /= 10) {
		sum += pow(n % 10, len);
	}

	return num == sum;
}

int intLen(int num) {
	int cnt = 0;

	while(num) {
		cnt++;
		num /= 10;
	}

	return cnt;
}

int main() {
	int maxNum;
	int i;
	long startTime;
	long endTime;
	long deltaTime;

	printf("请输入数值范围:");
	scanf("%d", &maxNum);

	startTime = clock();
	for (i = 0; i < maxNum; i++) {
		if (isSelfPower(i)) {
			printf("%d是自幂数\n", i);
		}
	}
	endTime = clock();
	deltaTime = endTime - startTime;
	printf("耗时:%ld.%03lds", deltaTime / CLOCKS_PER_SEC, deltaTime % CLOCKS_PER_SEC);

	return 0;
}

代码中的头文件 **“Nmec.h”**内容如下:

#ifndef _NMEC_H_
#define _NMEC_H_

typedef unsigned char boolean;

#define TRUE	1
#define FALSE   0
#define NOT_FOUND   -1

#endif

按照这个方法寻找9位数内的自幂数, 所需时间很长,等了6分钟就没在等。 下面介绍一种可以在一分半内找出9位数内的自幂数,话不多说放代码:

#include <stdio.h>
#include <time.h>

#include "Nmec.h"

const int array[][10] = {
	0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
	0, 1, 2*2, 3*3, 4*4, 5*5, 6*6, 7*7, 8*8, 9*9,
	0, 1, 2*2*2, 3*3*3, 4*4*4, 5*5*5, 6*6*6, 7*7*7, 8*8*8, 9*9*9,
	0, 1, 2*2*2*2, 3*3*3*3, 4*4*4*4, 5*5*5*5, 6*6*6*6, 7*7*7*7, 8*8*8*8, 9*9*9*9,
	0, 1, 2*2*2*2*2, 3*3*3*3*3, 4*4*4*4*4, 5*5*5*5*5, 6*6*6*6*6, 7*7*7*7*7, 8*8*8*8*8, 9*9*9*9*9,
	0, 1, 2*2*2*2*2*2, 3*3*3*3*3*3, 4*4*4*4*4*4, 5*5*5*5*5*5, 6*6*6*6*6*6, 7*7*7*7*7*7, 8*8*8*8*8*8, 9*9*9*9*9*9,
	0, 1, 2*2*2*2*2*2*2, 3*3*3*3*3*3*3, 4*4*4*4*4*4*4, 5*5*5*5*5*5*5, 6*6*6*6*6*6*6, 7*7*7*7*7*7*7, 8*8*8*8*8*8*8, 9*9*9*9*9*9*9,
	0, 1, 2*2*2*2*2*2*2*2, 3*3*3*3*3*3*3*3, 4*4*4*4*4*4*4*4, 5*5*5*5*5*5*5*5, 6*6*6*6*6*6*6*6, 7*7*7*7*7*7*7*7, 8*8*8*8*8*8*8*8, 9*9*9*9*9*9*9*9,
	0, 1, 2*2*2*2*2*2*2*2*2, 3*3*3*3*3*3*3*3*3, 4*4*4*4*4*4*4*4*4, 5*5*5*5*5*5*5*5*5, 6*6*6*6*6*6*6*6*6, 7*7*7*7*7*7*7*7*7, 8*8*8*8*8*8*8*8*8, 9*9*9*9*9*9*9*9*9,
};

boolean isSelfPower(int num);
int intLen(int num);
int numPower(int a, int p);

boolean isSelfPower(int num) {
	int n;
	int len;
	int sum = 0;

	len = intLen(num);
	for (n = num; n; n /= 10) {
	sum += numPower(n % 10, len);		
	}

	return num == sum;
}

int intLen(int num) {
	if (num < 0) {
		return 0;
	}
	if (num >= 100000000 && num <= 999999999) {
		return 9;
	}
	if (num >= 10000000 && num <= 99999999) {
		return 8;
	}
	if (num >= 1000000 && num <= 9999999) {
		return 7;
	}
	if (num >= 100000 && num <= 999999) {
		return 6;
	}
	if (num >= 10000 && num <= 99999) {
		return 5;
	}
	if (num >= 1000 && num <= 9999) {
		return 4;
	}
	if (num >= 100 && num <= 999) {
		return 3;
	}
	if (num >= 10 && num <= 99) {
		return 2;
	}
	return 1;
}

int numPower(int a, int p) {
	return array[p][a];
}

int main() {
	int maxNum;
	int i;
	long startTime;
	long endTime;
	long deltaTime;

	printf("请输入数值范围:");
	scanf("%d", &maxNum);

	startTime = clock();
	for (i = 0; i < maxNum; i++) {
		if (isSelfPower(i)) {
			printf("%d是自幂数\n", i);
		}
	}
	endTime = clock();
	deltaTime = endTime - startTime;
	printf("耗时:%ld.%03lds", deltaTime / CLOCKS_PER_SEC, deltaTime % CLOCKS_PER_SEC);

	return 0;
}

第二种方法程序运行结果如下:

由此可见,第二种方法出结果速度明显加快。对于比较好的机子,可以将时间控制在一分半内。
至此,我的第一篇博文就此问世,在此感谢教主的教诲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值