趣味算法--自幂数


自幂数

自幂数是指一个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位数自幂数
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 }
Java实现求n位数自幂数

代码测试结果

 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)
Python实现求n位自幂数

代码测试结果: 

 由于本人的电脑配置有点差,最多只测试了9位数的自幂数(Java和Python运行了20多分钟才运行完,10位数测了2个小时还没打印出一个就关闭程序了),想知道10位及以上位数的自幂数请自行测试。

推荐用C语言代码进行测试,执行速度比Java和Python快很多,虚拟机上测试9位数不到4分钟就出结果了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM