自幂数
自幂数是指一个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分钟就出结果了。