水仙花数

水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)
中文名
水仙花数
外文名
narcissistic number
别    名
pluperfect digital invariant
别    名
Armstrong number
学    科
数学、计算机

水仙花数

编辑

什么是水仙花数

水仙花数只是 自幂数的一种,严格来说三位数的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
……
使用高精度计算,可以得到超过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: 912985153
9: 472335975
9: 534494836
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个。

求取方法(非高精度)

编辑
以下为在各种编程语言中实现求取水仙花数的方法(非高精度)。

PHP水仙花数实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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所有位数理论输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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);
 
?>

pascal代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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.

Visual Basic 的“水仙花数”实现代码:

1
2
3
4
5
6
7
8
9
10
11
Private  Sub  Command1_Click()
Dim  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

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

C语言的代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int  cube( const  int  n){
returnn*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 ){
inti;
for (i=100;i<1000;++i){
if (isNarcissistic(i))
printf ( "%d\n" ,i);
}
return  EXIT_SUCCESS;
}

C语言简单易懂代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
#include <stdlib.h>
void  main() 
     int  i,j,k,n; 
     printf ( "'water flower'number is:" ); 
     for (n=100;n<999;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" ); 

C++中水仙花数实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using  namespace  std;
int  f( int  x)
  { int  y=1;
  for ( int  i=1;i<=3;i++)
   y=y*x;
  return  y;}
int  main()
{
  for ( int  i=100;i<=999;i++)
   { if (f(i%10)+f(i/10%10)+f(i/100%10)==i)
   cout<<i<<endl;}
  return  0;
}

C++中任意位数水仙花数实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include <cmath>
using  namespace  std;
int  _tmain( int  argc, _TCHAR* argv[])
{
     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;
}

Erlang中的实现代码:

1
[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].

python 中实现的代码:

1
2
3
4
5
6
#!/usr/bin/envpython
for  in  range ( 1 , 10 ):
     for  in  range ( 0 , 10 ):
         for  in  range ( 0 , 10 ):
            if  i * 100 + j * 10 + k = = i * i * i + j * j * j + k * k * k:
                 print (i * 100 + j * 10 + k)

Java 中实现的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package  sy1;
 
import  java.util.Scanner;
 
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++; 
     *      } 
     *  }
     */
     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" );
         }
     }
}

C# ASP 中的实现代码:

1
2
3
4
5
6
7
8
9
10
for (inti=100;i<1000;i++)
{
intbai=0;intshi=0;intge=0;intbaiyushu=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;}

JavaScript + HTML 实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE 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>

asp 中实现的代码:

<%
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
%>
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.

BASIC水仙花数

1-999999之间
REM Print all the Narcissistic numberREM between 1 and 999999FOR 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 iENDPB 实现的方法(只计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

ActionScript实现的方法

(只计3位数)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); } } }}

Delphi实现的方法

(100-999)
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)) endend;

MATLAB中实现的方法

(100-999)
方法一:
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
方法二(可现不定位数解):
n=Input["请输入大于2的自然数n:"];
For[i=10^(n-1),i<10^n-1,i++,
If[Total[IntegerDigits^IntegerLength]==i,
Print]]
BASH 脚本实现计算100-999之内数#!/bin/bashfor (( a=1; a<10; a++ ))do for (( b=0; b<10; b++ )) do for (( c=0; c<10; c++ )) do number1=$((a*100+b*10+c)) number2=$((a**3+b**3+c**3)) if [ $number1 -eq $number2 ]; then echo $number1 fi done donedone易语言代码 求指定范围内水仙花数
.版本 2
.子程序 取出水仙花数, 整数型, , 返回范围内水仙花数个数,如果范围过大将会十分耗时
.参数 起始数字, 整数型, , 从此数开始判断是否为水仙花数
.参数 结束数字, 整数型, , 此数必须大于起始数字
.参数 保存得到水仙花数的数组, 整数型, 可空 数组
.局部变量 数字数组, 文本型, , "0"
.局部变量 水仙花数, 整数型, , "0"
.局部变量 总和, 整数型
.局部变量 计次, 整数型
.局部变量 计次2, 整数型
.如果真 (起始数字 > 结束数字)
清除数组 (保存得到水仙花数的数组)
返回 (0)
.如果真结束
.变量循环首 (起始数字, 结束数字, 1, 计次)
.计次循环首 (取文本长度 (到文本 (计次)), 计次2)
加入成员 (数字数组, 取文本中间 (到文本 (计次), 计次2, 1))
处理事件 ()
.计次循环尾 ()
.计次循环首 (取数组成员数 (数字数组), 计次2)
总和 = 总和 + 求次方 (到数值 (数字数组 [计次2]), 取文本长度 (到文本 (计次)))
处理事件 ()
.计次循环尾 ()
.如果真 (总和 = 计次)
加入成员 (水仙花数, 计次)
.如果真结束
处理事件 ()
.变量循环尾 ()
保存得到水仙花数的数组 = 水仙花数
返回 (取数组成员数 (水仙花数))
BAT 计算100~999之间的水仙花数
@echo off&setlocal enabledelayedexpansion
for /l %%a in (1,1,9) do (
for /l %%b in (0,1,9) do (
for /l %%c in (0,1,9) do (
set /a ver1=%%a%%b%%c,ver2=%%a*%%a*%%a+%%b*%%b*%%b+%%c*%%c*%%c
if !ver1! == !ver2! echo !ver1!)))
pause>nul

用汇编语言输出水仙花数

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
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
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
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值