-
水仙花數
鎖定
- 中文名
- 水仙花數
- 外文名
- Narcissistic number
- 別 名
- pluperfect digital invariant
- 學 科
- 數學、計算機
目錄
- ▪ BASIC 實現
- ▪ Visual Basic 實現
- ▪ FORTRAN 實現
- ▪ Erlang實現
- ▪ Kotlin 實現
- ▪ Visual Fox Pro 實現
- ▪ F# 實現
- ▪ ActionScript 實現
- ▪ x86 16位彙編語言實現
- ▪ Lua實現
- ▪ Delphi 實現
- ▪ Julia實現
- ▪ Shell Script實現
水仙花數定義
附:其他位數的自冪數名字
一位自冪數:獨身數
三位自冪數:水仙花數
四位自冪數:四葉玫瑰數
五位自冪數:五角星數
六位自冪數:六合數
七位自冪數:北斗七星數
八位自冪數:八仙數
九位自冪數:九九重陽數
十位自冪數:十全十美數
水仙花數常見水仙花數
水仙花數又稱阿姆斯特朗數。
三位的水仙花數共有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;
十位的自冪數只有1個:4679307774
使用高精度計算,可以得到超過int類型上限的水仙花數:
5: 93084
5: 92727
5: 54748
6: 548834
7: 9800817
7: 4210818
7: 1741725
7: 9926315
8: 24678050
8: 24678051
8: 88593477
9: 146511208
9: 472335975
9: 534494836
9: 912985153
10: 4679307774
11: 32164049650
11: 40028394225
11: 42678290603
11: 49388550606
11: 32164049651
11: 94204591914
11: 44708635679
11: 82693916578
14: 28116440335967
16: 4338281769391370
16: 4338281769391371
17: 21897142587612075
17: 35641594208964132
17: 35875699062250035
19: 1517841543307505039
19: 3289582984443187032
19: 4929273885928088826
19: 4498128791164624869
20: 63105425988599693916
21: 449177399146038697307
21: 128468643043731391252
23: 27907865009977052567814
23: 35452590104031691935943
23: 27879694893054074471405
23: 21887696841122916288858
24: 174088005938065293023722
24: 188451485447897896036875
(為環保起見,24位以上的水仙花數略)
水仙花數求取方法
以下為在各種編程語言中實現求取水仙花數的方法(非高精度)。
水仙花數C 實現
//方法一 #include<stdio.h> #include<stdlib.h> #include<stdbool.h> int cube(const int n){ return n*n*n; } bool isNarcissistic(const int n){//判斷是不是水仙花數 int hundreds=n/100; int tens=n/10-hundreds*10; int ones=n%10; return cube(hundreds)+cube(tens)+cube(ones)==n; } int main(void){ int i; for(i=100;i<1000;++i){ if(isNarcissistic(i)) printf("%d\n",i); } return 0; }
//方法二 #include <stdio.h> #include <stdlib.h> int main() { int i,j,k,n; printf("'water flower'number is:"); for(n=100;n<1000;n++) { i=n/100;/*分解出百位*/ j=n/10%10;/*分解出十位*/ k=n%10;/*分解出個位*/ if(n==i*i*i+j*j*j+k*k*k) { printf("%-5d",n); } } printf("\n"); return 0; }
水仙花數C++ 實現
//一:C++中水仙花數實現代碼 #include<iostream> using std::cout; using std::endl; #define f(a) (a)*(a)*(a) int main() { for (int i = 100;i < 1000;i++) if (f(i % 10) + f(i / 10 % 10) + f(i / 100 % 10) == i) cout << i << endl; system("pause"); return 0; }
//二:C++中任意位數水仙花數實現代碼 #include<iostream> #include<cmath> using namespace std; int main(]) { long n1, n2, a; int i; cout << "請輸入Narcissistic number的位數:" << endl; cin >> i; cout << i << "位數的Narcissistic number包括:" << endl; for (n1 = pow(10, i - 1); n1 < pow(10, i); n1++) { n2 = 0; for (int j=0; j < i; j++) { a = pow(10, j); a = n1 / a; a = a % 10; a = pow(a, i); n2 = n2 + a; } if (n1 == n2) cout << n1 << endl; } return 0; }
水仙花數Java 實現
//方法一 package sy1; public class TestNarcissus { public static void main(String[] args) { int num = 100; int a[] = new int[3]; System.out.print("3位的水仙花數有:\t"); while (num <= 999) { int sum =0; a[0] = num / 100 % 10; a[1] = num / 10 % 10; a[2] = num % 10; for (int i = 0; i < 3; i++) { sum = sum + (int) Math.pow(a[i], 3); } if (num ==sum) { System.out.print(num + "\t"); } num++; } } }
//方法二 package sy1; import java.util.Scanner; public class TestNarcissus2 { public static void main(String[] agrs) { System.out.print("指定最大位數N:"); Scanner input = new Scanner(System.in); int N = input.nextInt(); input.close(); for (int i = 3; i <= N; i++) { int a[] = new int[i]; int num = (int) Math.pow(10, i - 1) + 1; System.out.print(i + "位的水仙花數有:\t"); while (num <= Math.pow(10, i)) { int sum = 0; for (int j = 0; j < i; j++) a[j] = (int) (num / Math.pow(10, j) % 10); for (int j = 0; j < i; j++) sum = sum + (int) Math.pow(a[j], i); if (num == sum) System.out.print(num + "\t"); num++; } System.out.print("\n"); } } }
水仙花數Python 實現
#方法一: def narcissistic_number_1(num): length = len(str(num)) count = length num_sum = 0 while count: num_sum += ((num // 10 ** (count - 1)) % 10) ** length count -= 1 if num_sum == num: print("%d is %d bit narcissistic_number" % (num, length)) #方法二: def narcissistic_number_2(num): s = str(num) length = len(s) sum_num = 0 for i in s: sum_num += int(i)**length if sum_num == num: print("%d is a %d bit narcissistic_number" % (num, length)) max_num = int(input('請輸入最大範圍')) # 獲取小於指定數的阿姆斯特朗數 for num in range(0, max_num): narcissistic_number_1(num) #調用方法一,方法二均可 #方法三 for i in range(1,10): for j in range(0,10): for k in range(0,10): if i*100+j*10+k==i**3+j**3+k**3: print(i*100+j*10+k) #四位自冪數: for i in range(1000, 10000): a = int(i/1000) b = int(i % 1000/100) c = int(i % 100/10) d = int(i % 10) if pow(a, 4) + pow(b, 4) + pow(c, 4) + pow(d, 4) == i: print(i)
水仙花數JavaScript 實現
<!DOCTYPE html> <!--包含在HTML中--> <html> <head> <meta charset="utf-8"> </head> <body> <script type="text/javascript"> var a = 0, b = 0, c = 0; for (var i = 100; i < 1000; i++) { a = i % 10; b = parseInt(((i / 10) % 10)); c = parseInt(i / 100); if (i === a * a * a + b * b * b + c * c * c) { document.write('水仙花數: ' + i + '<br/>'); } } </script> </body> </html>
水仙花數PHP 實現
PHP水仙花數實現代碼
<?php //使用系統自帶函數,即可實現冪運算,何必畫蛇添足,自己寫函數 functionis_narcissistic($n) { $hundreds=floor($n/100);//分解出百位 $tens=floor($n/10)%10;//分解出十位 $ones=floor($n%10);//分解出個位 return(bool)(pow($hundreds,3)+pow($tens,3)+pow($ones,3)==$n); } for($i=100;$i<1000;++$i) { if(is_narcissistic($i)) echo$i."\n"; } die(); ?>
PHP所有位數理論輸出
<?php /** *水仙花數為不小於3位的數字,每位數字的N次冪的和等於該數字.N為該數字的位數 *@namedaffodilsNum水仙花數 *@param$places水仙花位數>=3 */ functiondaffodilsNum($places=3){//定義位數 if(!defined('PLACES'))define('PLACES',is_numeric($places)?$places:3); if(PLACES>=3){$min=pow(10,PLACES-1); //選數範圍起始位置 $max=pow(10,PLACES); //選數範圍結束位置//開始選數 for($i=$min,$out='';$i<$max;$i++){$sum=0; //當前選數下各個冪值的和 $arr=str_split($i);//以字符串方式分割選數 for($j=0;$j<PLACES;++$j)//對每個數字作冪操作並累加 {$sum+=pow($arr[$j],PLACES);if($sum>$i) //如果當前累加已大於選數,則跳出循環 break;}if($sum==$i)//如果符合定義,將該數字添加到輸出隊列 $out.=$i."\n";} //輸出隊列 echo$out;} } echodaffodilsNum(3); ?>
水仙花數MATLAB 實現
方法一:
for m=100:999 m1=fix(m/100); m2=rem(fix(m/10),10); m3=rem(m,10); if m==m1^3+m2^3+m3^3 disp(m) end end
方法二:
m = 100:999; n = floor(m/100).^3+mod(fix(m/10),10).^3+mod(m,10).^3; m(find(m==n))
水仙花數swift 實現
var i = 100 while i < 999 { let nums = i.description.map({Double($0.description)!}) if nums.map({pow($0,Double(nums.count))}).reduce(0,+) == Double(i) { print("水仙花:\(i)") } i += 1 }
水仙花數Golang 實現
package main import ( "fmt" "strconv" ) func main() { var a, b int64 fmt.Println("請輸入求a,b:") fmt.Scanf("%d,%d", &a, &b) if a > b { a, b = b, a } for i := a; i <= b; i++ { if isNarcissusFew(i) { fmt.Println(i) } } } func isNarcissusFew(number int64) bool { var sum int64 numberStr := strconv.FormatInt(number, 10) for _, data := range numberStr { lenght := len(numberStr) num := (int64)(data - 48) var sum1 int64 = 1 for lenght != 0 { sum1 *= num lenght-- } sum += sum1 } if sum == number { return true } return false }
水仙花數C# 實現
for(int i=100;i<1000;i++) { int bai=0;int shi=0;int ge=0;int baiyushu=0; bai=i/100; baiyushu=i%100; shi=baiyushu/10; ge=baiyushu%10; if(i==bai*bai*bai+shi*shi*shi+ge*ge*ge) { Console.WriteLine("水仙花數:"+i+"<br>"); } }
//補充C#水仙花數實現代碼(任意位數) /// <summary>/// 判斷一個數是否是水仙花數/// </summary>/// <param name="num">要判斷的數</param>/// <returns>判斷結果:true-是,false-否</returns> bool isWaterFlower(int num){if (num <= 0){return false;} int temp = num; //將要判斷的數值各位上的數字拆開放在集合中 ArrayList list = new ArrayList(); while (temp > 0) { list.Add(temp % 10);temp /= 10;} //判斷各位上的數字位數次方之後是否等於要判斷是數,是的話則為水仙花數 int sum = 0; foreach (int i in list) { int mul = 1; for (int j = 0; j < list.Count; j++){mul *= i;} sum += mul; } return sum == num; }
補充C#中1000以內水仙花數實現代碼(同理可根據需求自行增加變量及循環次數,此處僅為舉例) int number = 100; //聲明變量number初始值為100 for(int i=1;i<10;i++) //聲明百位數的值變量為 i,賦值為1,每次循環加1 { for(int j=0;j<10;j++) //聲明十位數的值變量為j,賦值為0,每次循環加1 { for(int r=0;r<10;r++) //聲明個位數的值為r,賦值為0,每次循環加1 { if(i*i*i+j*j*j+r*r*r==number) { Console.WriteLine("水仙花數:{0}", number); } number++; //number加1 } } }
水仙花數ALGOL 實現
begin integer i,j,k; for i := 1 step 1 until 9 do for j := 0 step 1 until 9 do for k := 0 step 1 until 9 do if i×i×i + j×j×j + k×k×k = 100×i + 10×j + k then print (100×i + 10×j + k); end
水仙花數pascal 實現
program narcissistic_number; var a,b,c:integer; begin for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do if a*a*a+b*b*b+c*c*c=100*a+10*b+c then writeln(100*a+10*b+c); end. 或 program narcissistic_number; var a,b,c,d:integer; begin for a:=100 to 999 do begin b:=a mod 10; c:=a mod 100 div 10; d:=a div 100; if b*b*b+c*c*c+d*d*d=a then writeln(a); end; end. 或 program narcissistic_number; var a, b, c, i, t : integer; begin i := 100; repeat a:=trunc(i/100); b:=trunc(i/10) - a*10; c:=i-trunc(i/10) * 10; t:= a*a*a + b*b*b + c*c*c; if i = t then writeln(i,'=',a,'^3+',b,'^3+',c,'^3'); i := i + 1 until i > 999 end.
水仙花數BASIC 實現
1-999999之間
REM Print all the Narcissistic number REM between 1 and 999999 FOR i = 1 TO 999999 e$ = STR$(i) a$ = MID(e$, 1, 1) b$ = MID(e$, 2, 1) c$ = MID(e$, 3, 1) d$ = MID(e$, 4, 1) a = VAL(a$) AND b = VAL(b$) AND c = VAL(c$) AND d = VAL(d$) IF i = a ^ 4 + b ^ 4 + c ^ 4 + d ^ 4 THEN PRINT i; NEXT i ENDPB
實現的方法(只計3位數) int s,a,b,c for s=100 to 999 a=integer(s/100) b=integer((s - a*100)/10) c=s - integer(s/10)*10 if s=a^3+b^3+c^3 then messagebox("",s) end if next
水仙花數Visual Basic 實現
Visual Basic 的“水仙花數”實現代碼
Private Sub Command1_Click() Dim i As Integer, a As Integer, b As Integer, c As Integer For i = 100 To 999 Step 1 a = i \ 100 b = (i - 100 * a) \ 10 c = i - 100 * a - 10 * b If a^(3) + b^(3) + c^(3) = i Then Print i End If Next i End Sub
Visual Basic 簡單易懂代碼實現
Dim a As Integer, b As Integer, c As Integer For a = 0 To 9 For b = 0 To 9 For c = 0 To 9 If a * 100 + b * 10 + c = a ^ 3 + b ^ 3 + c ^ 3 Then Console.WriteLine(a * 100 + b * 10 + c) End If Next Next Next
<% dim a,b,c,d,m,n,z i=1 for i=100 to 999 a=mid(i,1,1) b=mid(i,2,1) c=mid(i,3,1) d=a*a*a m=b*b*b n=c*c*c z=d+m+n if z=i then response.write z & "<br>" end if next %>
水仙花數FORTRAN 實現
C Print all the Narcissistic numberC between 100 and 999 WRITE(*,30) DO 10 K=100,999 IA=K/100 IB=MOD(K,100)/10 IC=MOD(K,10) IF(K.NE.IA**3+IB**3+IC**3) GOTO 10 WRITE(*,20) K, IA,IB,IC10 CONTINUE20 FORMAT(5X,4I4)30 FORMAT(5X,18HN=I**3+J**3+K**3) STOP END
水仙花數Erlang實現
[X*100+Y*10+Z||X<-lists:seq(1,9),Y<-lists:seq(0,9),Z<-lists:seq(0,9),X*X*X+Y*Y*Y+Z*Z*Z=:=X*100+Y*10+Z].
水仙花數Kotlin 實現
fun main(args: Array<String>) { val n = 5 println(factorial1(n)) println(factorial2(n)) (100..999).filter { val r = it / 100 val s = (it - r * 100) / 10 val t = it - r * 100 - s * 10 it == r * r * r + s * s * s + t * t * t }.forEach{ println(it)} }
水仙花數Visual Fox Pro 實現
sumnum = 0 FOR a = 3 TO 7 ?ALLTRIM(STR(a))+"位的水仙花數有: " FOR i=10^(a-1) TO 10^a-1 FOR m = 1 TO a n = SUBSTR(ALLTRIM(STR(i)),m,1) sumnum = sumnum+VAL(n)^a ENDFOR IF i = sumnum ??STR(i,a,0)+" " ENDIF sumnum = 0 ENDFOR ENDFOR
Visual FoxPro 用表單實現法(只計3位) 方法一: clear for a=1 to 9 for b=0 to 9 for c=0 to 9 x=a*100+b*10+c if x=a^3+b^3+c^3 ?x endif endfor endfor endfor 方法二: (1)創建表單Form1並添加文本框Text1與命令按鈕Command1 (2)修改Command1的Caption屬性為“計算並顯示” (3)為Form1添加方法sxh (4)修改方法sxh代碼如下 para x x1=int(x%10) x2=int(x/10)%10 x3=int(x/100)%100 if x=x1^3+x2^3+x3^3 return .t. else return .f. endif (5)為Command1的Click事件編寫如下的事件代碼: thisform.currentx=thisform.width/2 thisform.currenty=thisform.height/2 thisform.print("水仙花數是:") for m=100 to 999 thisform.text1.value=m sure=thisform.sxh(m) if sure=.t. thisform.print(str(m,4)+space(3)) inkey(0.5) endif for 延遲=1 to 20000 yiru=2008610029 endfor endfor this.enabled=.f.
水仙花數F# 實現
let power3 x= x*x*x let findNarcissisticNumber ()= seq {100..999} |> Seq.where (fun num-> let x= num/100 //百位 let y= num%100/10 //十位 let z= num%10 //個位 power3 x + power3 y + power3 z = num) let narcissisticNumbers= findNarcissisticNumber() printfn "Narcissistic Numbers :%A" narcissisticNumbers
水仙花數ActionScript 實現
var n:int; var m:int; for (var i:int=1; i<=9; i++) { for (var j:int=1; i<=9; j++) { for (var k:int=1; i<=9; k++) { m=i*100+j*10+k; if (m==i*i*i+j*j*j+k*k*k) { n++; trace(m); } } } }
水仙花數x86 16位彙編語言實現
stack segment stack dw 256 dup (?) stack ends data segment buf db 3 dup (?) data ends code segment assume cs:code,ds:data,ss:stack fj proc near ;三位數,百位、十位、個位分開,保存在buf中 push cx push dx push si mov si,0 ;數組下標 mov cx,10 fj1: mov dx,0 div cx mov buf[si],dl inc si or ax,ax jnz fj1 mov ax,si pop si pop dx pop cx ret fj endp print proc near ;打印三位數 push cx push dx mov dx,-1 push dx mov cx,10 p1: mov dx,0 div cx push dx or ax,ax jnz p1 p2: pop dx cmp dx,-1 je p9 add dl,30h mov ah,2 int 21h jmp p2 p9: mov dl,9 ;輸出製表符Tab mov ah,2 int 21h pop dx pop cx ret print endp start: mov ax,data mov ds,ax mov bx,100 s0: mov ax,bx call fj mov cx,ax mov si,0 ;數組下標 mov dx,0 s1: mov al,buf[si] ;以下三行,求立方 mul buf[si] mul buf[si] add dx,ax inc si loop s1 cmp dx,bx jne s2 mov ax,dx call print s2: inc bx cmp bx,1000 jb s0 mov ah,4ch int 21h code ends end start
水仙花數Lua實現
輸出10000以內·水仙花數
function IsNarcLNum(num) local lenth = string.len(tostring(num)) local sumval = 0 num = math.modf(num) local data = num while(data > 0 ) do sumval = sumval + (math.fmod(data, 10)^lenth) data = math.modf(data/10) end if sumval == num then return true else return false end end val = 10000 for i = 1, val do if IsNarcLNum(i) then print(string.format("%d", i)) end end
水仙花數Delphi 實現
var a,b,c,d:integer; begin for a:=100 to 999 do begin b := a div 100; c := a div 10 mod 10; d := a mod 10; if b*b*b+c*c*c+d*d*d=a then memo1.Lines.Add(inttostr(a)) end end;
水仙花數Julia實現
n = 0 for i = 100:999 x1 = Int(floor(i/100)) x2 = Int(floor(i%100/10)) x3 = i%10 if i == x1^3 + x2^3 + x3^3 print(i) global n = n + 1 end end
水仙花數Shell Script實現
#!/bin/bash echo -n "請輸入數字" read num sum=0 len=${#num} for loop in `seq 0 $[$len-1]` do cor="${num:$loop:1}" if grep '^[[:digit:]]*$' <<< "$cor" > /dev/null; then sum=$[$sum+$cor**$len] fi done if [ "$sum" == "$num" ];then echo "是水仙花數" else echo "不是水仙花數" fi