标题：水仙花数
水仙花数
什么是水仙花数水仙花数只是自幂数的一种，严格来说三位数的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: 35875699062250035
17: 21897142587612075
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位以上的水仙花数略)
理论上，最大的水仙花数不超过34位。
求取方法（非高精度）
以下为在各种编程语言中实现求取水仙花数的方法（非高精度）。PHP “水仙花数”实现代码：<?php 
for ($i=100;$i<1000;$i++) {
$m = floor($i/100); //分解出百位 
$n = floor($i/10)%10;//分解出十位 
$k = floor($i%10);//分解出个位 
if ($i == ($m*$m*$m+$n*$n*$n+$k*$k*$k)) { 
echo $i."<br/>"; 
} 
} 
?> PHP 所有位数 理论输出：/** * 水仙花数 为不小于3位的数字,每位数字的N次幂的和等于该数字.N为该数字的位数
* @name daffodilsNum 水仙花数
* @param $places 水仙花位数 >=3
*/
function daffodilsNum($places=3){
//set_time_limit(0); //设置脚本超时为不限制,如果提示30秒超时,可以开启本控制
//$begin=microtime(); //脚本开始时间
//定义位数
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.'<br/>';
}
}
//输出队列
echo $out;
//echo "<br/>".(microtime()-$begin); //输出脚本耗时,当脚本开始时间开启时有效
}
else{
//$this->error('错误的位数'); //提示错误的位数
}
}C 语言的"水仙花数"实现代码：#include <stdio.h> int main() { int i,d1,hub,transit; for(i=100;i<=9999;++i) { for(hub=0 ,transit=i,d1=123; transit!=0;)  { d1=(transit%10)*(transit%10)*(transit%10); 
/* 
多位数需要多添加一个循环 懒得改了 怪我手滑
*/
hub=hub+d1; transit=transit/10; }  if(hub==i) printf("水仙花数%d\n",i); } return 0; }PASCAL 实现代码:program shuixianhuashu;
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 sxh; 
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 abcd;
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 的"水仙花数"实现代码：Private Sub Command2_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
Next i
End SubFORTRAN 的"水仙花数"实现代码：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,IC
10 CONTINUE
20 FORMAT(5X,4I4)
30 FORMAT(5X,18HN=I**3+J**3+K**3)
STOP
ENDC++ 编译器上的水仙花数实现代码#include<iostream>
using namespace std;
int main()
{int a,q,w,e;
for(a=100;a<1000;++a)
{q=a/100;
w=(a-q*100)/10;
e=(a-q*100-w*10);
if(a==q*q*q+w*w*w+e*e*e)
cout<<a<<"是水仙花数"<<endl;};
return 0;
}python 中实现的代码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*i*i+j*j*j+k*k*k:
print i*100+j*10+kJava 中实现的代码public class NumberOfDaffodils {
public static void main(String[] args) {
List<Long> numbers = new ArrayList<Long>();
for(long i = 100; i < Long.MAX_VALUE ; i++){
if(match(i)){
numbers.add(i);
}
}
System.out.println(numbers);
}
private static boolean match(long in) {
//统计位数
int count = (in+"").length();
//记录每位数字
long temp = 0;
//辗转取余的保存数
long num = in;
//求和数
long sum = 0;
for(int i = count ; i > 0 ; i--){
temp = num/(long)Math.pow(10,i-1);
num = num%(long)Math.pow(10,i-1);
sum+=Math.pow(temp,count);
}
return in == sum;
}
}C# ASP.N 中的实现代码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;
}javascript +html 实现可变位数的运算:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 　<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>无标题文档</title> 
<script type="text/javascript"> 
function fun(){ 
//取得参量位数 
var valnum=parseInt(document.frm.input.value); 
//求得符合参量位数的最大值和最小值 
var highnum=Math.pow(10,valnum)-1; 
var lownum=Math.pow(10,valnum-1); 
//输出队列的组成部分 
var output="共有个数:",res_str=""; 
//a为i分解为数组的下脚值,num为符合规则的水仙花的个数 
var a=0,num=0; 
//遍历所有符合参量位数的数 
for(i=lownum;i<=highnum;i++){ 
//res为水仙花数规则值,即n位的数的每位数的n次幂的和,预置为0 
var res=0; 
//分解出当前i的每位数并存如数组
var new_i=i.toString().split(""); 
for(a=0;a<=valnum-1;a++){ 
//求得水仙花数规则值 
res=Math.pow(parseInt(new_i[a]),valnum)+res; 
} 
//判断符合水仙花数的个数,如符合则将水仙花数并入输出队列 
if(res==i){ 
num++; 
res_str=res_str+"<br>"+res; 
} 
} 
//输出队列 
if(valnum<3){output="你输入了无效位数!";} 
else{output=output+num+res_str;} 
//输出 
document.getElementById("divnum").innerHTML=output; 
} 
</script> 
</head> 
<body><form name="frm"> 
<label>请输入水仙花的位数(N>=3):</label><input type="text" name="input" value=""> 
<input value="运算" type="button" onclick="fun()" /> 
</form> 
<div id="divnum" style=" position:absolute;left:100px;width:200px;top:100px;"></div> 
</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.
QBASIC水仙花数1—999999之间
CLS 
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
nextActionScript实现的方法（只计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)) 
end 
end;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
或者：Mathematica实现方法（可现不定位数解）n=Input["请输入大于2的自然数n:"];
For[i=10^(n-1),i<10^n-1,i++,
If[Total[IntegerDigits^IntegerLength]==i,
Print]]添加一种C++的算法#include<iostream>
#include<cmath>
using namespace std;
void main()
{int a,b,c,e,f,g;
double d;
b=1;
f=0;
a=100;
e=0;
c=g=a;
A:do
{
a/=10;
b++;}
while(a>10);
do{d=g%10;
g/=10;
e+=pow(d,b);
f++;}
while(f!=b+1);
if(e==c)
{cout<<c<<"\n";
c++;
a=g=c;
b=1;
f=0;
e=0;
goto A;}
else
{c++;
a=g=c;
b=1;
f=0;
e=0;
goto A;}}BASH 脚本实现计算100-999之内数#!/bin/bash
for (( 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 "Found number $number1" 
fi 
done 
done
done易语言代码 求指定范围内水仙花数.版本 2
.子程序 取出水仙花数, 整数型, , 返回范围内水仙花数个数，如果范围过大将会十分耗时
.参数 起始数字, 整数型, , 从此数开始判断是否为水仙花数
.参数 结束数字, 整数型, , 此数必须大于起始数字
.参数 保存得到水仙花数的数组, 整数型, 可空 数组
.局部变量 数字数组, 文本型, , "0"
.局部变量 水仙花数, 整数型, , "0"
.局部变量 总和, 整数型
.局部变量 计次, 整数型
.局部变量 计次2, 整数型
.如果真 (起始数字 > 结束数字)
清除数组 (保存得到水仙花数的数组)
返回 (0)
.如果真结束
.变量循环首 (起始数字, 结束数字, 1, 计次)
.计次循环首 (取文本长度 (到文本 (计次)), 计次2)
加入成员 (数字数组, 取文本中间 (到文本 (计次), 计次2, 1))
处理事件 ()
.计次循环尾 ()
.计次循环首 (取数组成员数 (数字数组), 计次2)
总和 = 总和 + 求次方 (到数值 (数字数组 [计次2]), 取文本长度 (到文本 (计次)))
处理事件 ()
.计次循环尾 ()
.如果真 (总和 = 计次)
加入成员 (水仙花数, 计次)
.如果真结束
处理事件 ()
.变量循环尾 ()
保存得到水仙花数的数组 = 水仙花数
返回 (取数组成员数 (水仙花数))vb代码 判断水仙花数Dim a() As Integer
n = InputBox("请输入一个n位正整数" & Chr(10) & "n大于等于3", "水仙花数", 153)
Dim i As Integer
m = Len(n)
ReDim a(1 To m) As Integer
For i = 1 To m
a(i) = Val(Mid(n, i, 1))
Next i
For i = 1 To m
s = a(i) ^ m + s
Next i
If s = Val(n) Then
MsgBox "是水仙花数"
Else
MsgBox "不是水仙花数"
End If
再加一种C语言方法：
//水仙花数
#include <stdio.h>
#include <math.h>
int main()
{
unsigned long fr,to,n,m,k,sum;
int nLog,numlen,brPoint=1;
//输入100～约4000000000（unsigned long）间的范围
printf("Input Number Range ('from' 'to'):"); scanf("%lu %lu",&fr,&to);
for(n=fr;n<=to;n++)
{
//算出n有多少位
nLog = log10(n);
numlen = floor(nLog)+1;
//数n 的各位数字 的位数次幂 的和
m=n;
sum=0;
while(m>0)
{
k=m%10;
sum+=pow(k,numlen);
m=m/10;
}
//若是水仙花数，输出。每行5个
if(sum==n)
{
printf("%12lu",n);
if(brPoint%5==0)
{
printf("\n");
brPoint=0;
}
brPoint++;
}
}
return 0;
}FreeBasic实现100~999之间的水仙花数FOR I=100 TO 999
A=I\100
B=I\10 MOD 10
C=I MOD 10
IF A*A*A+B*B*B+C*C*C=I THEN PRINT I:S=S+1
NEXT I
PRINT S
SLEEP
END 
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