自幂数
自幂数是指一个n位数,它的每个位上的数字的n次幂之和等于它本身(例如:1^3+5^3+3^3=153)。自幂数包括:
一位自幂数:独身数
二位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
常见自幂数
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙花数共有3个:24678050,24678051,88593477
九位的九九重阳数共有4个:146511208,472335975,534494836,912985153
求n位自幂数
现在我们用代码来实现求各个位数的自幂数。

1 #include <stdio.h>
2
3 //自定义my_pow函数,C语言自带的pow函数返回值为double类型
4 //转long类型精度会缺失。
5 long int my_pow(int a, int n)
6 {
7 long result = 1;
8 int i = 0;
9 for (i; i < n; i++)
10 result *= a;
11
12 return result;
13 }
14
15 // 判断是否为水仙花数
16 int isNarNum(long int num, int n)
17 {
18 long int number = num;
19 long int result = 0;
20
21 int i;
22 //获取各个位数,并求n次幂之和
23 for (i = n-1; i >= 0; i--)
24 {
25 result += my_pow(number%10, n);
26 number /= 10;
27 }
28
29 return result == num ? 1 : 0;
30 }
31
32 // 打印n位的水仙花数
33 void printNarNum(int n)
34 {
35 long start = my_pow(10, n-1); //n位数的起始位数
36 int count = 0; //用于统计有多少个自幂数
37 long num = 0;
38 //打印自幂数
39 for ( num = start; num < start*10; num++)
40 { //如果是自幂数则打印
41 if (isNarNum(num, n))
42 {
43 printf("%ld 是自幂数。", num);
44 count++;
45 }
46 }
47 printf("%d 位的自幂数有 %d 个。", n, count);
48 }
49
50 int main(void)
51 {
52 int n = 0;
53 printf("请输入求几位数的自幂数:");
54 scanf("%d", &n);
55
56 printNarNum(n);
57
58 return 0;
59 }
60
61 C语言实现求n位数自幂数
代码测试结果


1 import java.util.Scanner;
2
3 public class NarNum {
4
5 /**
6 * 用于判断一个数是否是自幂数。
7 * @param num 是需要进行自幂数判断的数。
8 * @param n 需要判断的数的位数。
9 * @return 如果num是自幂数返回true,否则返回false。
10 */
11 public static boolean isNarNumber(long num, int n) {
12 long tag = num; //将num赋值给tag,用于结果的判断
13 long sum = 0; //用于存储每个位上的数字的 n 次幂之和
14
15 /*获取num的各个位的数*/
16 for (int i = n-1; i >= 0; i--) {
17 sum += Math.pow(num%10, n);
18 num /= 10;
19 }
20
21 return sum == tag ? true : false;
22 }
23
24 /**
25 * 打印自幂数方法。
26 * @param n 打印n位数的自幂数。
27 */
28 public static void printNarNumber(int n) {
29 long num = (long) Math.pow(10, n-1); //n位数开始数字
30 int total = 0; //用于统计n位水仙花数的个数
31 /*打印自幂数*/
32 for (long i = num; i < num*10; i++) {
33 if (isNarNumber(i, n)) {
34 System.out.println(i + " 是自幂数。");
35 total++;
36 }
37 }
38 System.out.println(n + "位的自幂数有:"+ total + " 个");
39 }
40
41 public static void main(String[] args) {
42 Scanner input = new Scanner(System.in);
43 System.out.println("请输入自幂数的位数:");
44 int size = input.nextInt();
45
46 printNarNumber(size);
47 }
48 }
代码测试结果


1 def isNarNumber(num, n):
2 '''用于判断一个数是否位一个自幂数'''
3 strNum = str(num)
4 sum = 0
5 for i in strNum:
6 sum = sum + pow(int(i), n)
7 return True if sum == num else False
8
9 def printNarNumber(n):
10 '''用于n位数的自幂数'''
11 total = 0
12 for i in range(pow(10, n-1), pow(10, n)):
13 if isNarNumber(i, n):
14 print("%d 是自幂数。" %i)
15 total += 1
16 print("%d 位的自幂数有 %d 个。" %(n, total))
17
18 n = int(input("请输入自幂数的位数:"))
19
20 printNarNumber(n)
代码测试结果:

由于本人的电脑配置有点差,最多只测试了9位数的自幂数(Java和Python运行了20多分钟才运行完,10位数测了2个小时还没打印出一个就关闭程序了),想知道10位及以上位数的自幂数请自行测试。
推荐用C语言代码进行测试,执行速度比Java和Python快很多,虚拟机上测试9位数不到4分钟就出结果了。
来源:https://www.cnblogs.com/1-6-0/p/9107684.html
