趣味算法--自冪數


自冪數

自冪數是指一個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