自冪數
自冪數是指一個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分鍾就出結果了。
