请输入您要查询的百科知识:

 

词条 水仙花数
释义

水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)

什么是水仙花数

水仙花数只是自幂数的一种,严格来说三位数的自幂数才成为水仙花数。

附:其他位数的自幂数名字

一位自幂数:独身数

两位自幂数:没有

三位自幂数:水仙花数

四位自幂数:四叶玫瑰数

五位自幂数:五角星数

六位自幂数:六合数

七位自幂数:北斗七星数

八位自幂数:八仙数

九位自幂数:九九重阳数

十位自幂数:十全十美数

常见水仙花数

水仙花数又称阿姆斯特朗数。

三位的水仙花数共有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++){

$a=intval($i/100);

$b=intval($i/10)%10;

$c=$i%10;

if(pow($a,3)+pow($b,3)+pow($c,3)==$i){

echo $i."\\t";

}

}

?>

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>

#include<math.h>

int main (void) {

long n,p;

long c,a,j,s[30],i,q;

p=0;

a=10;

scanf("%ld",&n);

q=n;

for (i=1;c>10 ;++i) {

c=n/a;

a=a*10;

}printf("i=%ld,a=%ld \",i,a);

for (j=1;a>=10 ;++j) {

s[j]=n/(a/10);

n=n-s[j]*(a/10);

a=a/10;

printf("j=%ld,a=%ld\",j,a);

}

for (j=1;j<=i ;j++) {

p+=pow(s[j],i);

printf("p=%ld,i=%ld\",p,i);

}

if (p==q) {

printf("%ld 为水仙花数",q);

}else {

printf("%ld 该数不是水仙花数",q);

}

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 Sub

FORTRAN 的"水仙花数"实现代码:

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

END

C++ 编译器上的水仙花数实现代码

#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;

}

pyhon 中实现的代码

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+k

Java 中实现的代码

public class shuixianhuashu {

public static void main(String[] args) {

for(int i=100; i<1000; i++){

int a = i/100;

int b = i/10%10;

int c = i%10;

if(Math.pow(a,3)+Math.pow(b,3)+Math.pow(c,3)==i)

System.out.println(i+"是水仙花数");

}

}

}

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位)

(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

END

PB 实现的方法(只计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))

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<<"\";

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

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("\");

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

补充vb(可查询任意范围内的水仙花数):

'将下列代码复制到窗体load 或按钮click事件内

Dim xxx As Integer

Dim kaishi As Integer

Dim jieshu As Integer

kaishi = InputBox("请输入所要寻找“水仙花数”数字的下限(如2-999,输入2)")

jieshu = InputBox("请输入所要寻找“水仙花数”数字的上限(如2-999,输入999)")

For i = kaishi To jieshu

xxx = 0

For j = 1 To Len(i)

xxx = xxx + Mid(i, j, 1) ^ 3

Next j

If xxx = i Then

MsgBox (xxx & "是水仙花数")

End If

Next i

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/1/29 7:50:21