複製鏈接
請複製以下鏈接發送給好友

水仙花數

鎖定
水仙花數(Narcissistic number)也被稱為超完全數字不變數(pluperfect digital invariant, PPDI)、自戀數自冪數、阿姆斯壯數或阿姆斯特朗數(Armstrong number),水仙花數是指一個 3 位數,它的每個數位上的數字的 3次冪之和等於它本身。例如:1^3 + 5^3+ 3^3 = 153。
中文名
水仙花數
外文名
Narcissistic number
別    名
pluperfect digital invariant
學    科
數學、計算機

水仙花數定義

水仙花數只是自冪數的一種,嚴格來説3位數的3次冪數才稱為水仙花數。
附:其他位數的自冪數名字
一位自冪數:獨身數
三位自冪數:水仙花數
四位自冪數:四葉玫瑰數
五位自冪數:五角星數
六位自冪數:六合數
七位自冪數:北斗七星數
八位自冪數:八仙數
九位自冪數:九九重陽數
十位自冪數:十全十美數

水仙花數常見水仙花數

水仙花數又稱阿姆斯特朗數
三位的水仙花數共有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位以上的水仙花數略)
最大的水仙花數有39位。十進制自然數中的所有水仙花數共有88個。

水仙花數求取方法

以下為在各種編程語言中實現求取水仙花數的方法(非高精度)。

水仙花數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
aspVB實現
<%
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