水仙花数_百度百科

水仙花数

数学、计算机名词
收藏
0有用+1
0
水仙花数(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