水仙花数.docx
《水仙花数.docx》由会员分享,可在线阅读,更多相关《水仙花数.docx(20页珍藏版)》请在冰豆网上搜索。
![水仙花数.docx](https://file1.bdocx.com/fileroot1/2022-11/16/a46362f2-f08f-4c9f-a36c-b6f3191e9c98/a46362f2-f08f-4c9f-a36c-b6f3191e9c981.gif)
水仙花数
水仙花数
水仙花
什么是水仙花数
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
水仙花数是指一个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为该数字的位数
*@namedaffodilsNum水仙花数
*@param$places水仙花位数>=3
*/
functiondaffodilsNum($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 $sum+=pow($arr[$j],PLACES);
if($sum>$i){//如果当前累加已大于选数,则跳出循环
break;
}
}
if($sum==$i){//如果符合定义,将该数字添加到输出队列
$out.=$i.'
';
}
}
//输出队列
echo$out;
//echo"
".(microtime()-$begin);//输出脚本耗时,当脚本开始时间开启时有效
}
else{
//$this->error('错误的位数');//提示错误的位数
}
}
C语言的"水仙花数"实现代码:
#include
#include
intmain(void){
longn,p;
longc,a,j,s[30],i,q;
p=0;
a=10;
scanf("%d",&n);
q=n;
for(i=1;c>10;++i){
c=n/a;
a=a*10;
}printf("i=%d,a=%d\n",i,a);
for(j=1;a>=10;++j){
s[j]=n/(a/10);
n=n-s[j]*(a/10);
a=a/10;
printf("j=%d,a=%d\n",j,a);
}
for(j=1;j<=i;j++){
p+=pow(s[j],i);
printf("p=%d,i=%d\n",p,i);
}
if(p==q){
printf("%d为水仙花数",q);
}else{
printf("%d该数不是水仙花数",q);
}
}
PASCAL实现代码:
programshuixianhuashu;
var
a,b,c:
integer;
begin
fora:
=1to9do
forb:
=0to9do
forc:
=0to9do
ifa*a*a+b*b*b+c*c*c=100*a+10*b+cthenwriteln(100*a+10*b+c);
end.
或:
programsxh;
vara,b,c,d:
integer;
begin
fora:
=100to999dobegin
b:
=amod10;
c:
=amod100div10;
d:
=adiv100;
ifb*b*b+c*c*c+d*d*d=athenwriteln(a);
end;
end.
或
programabcd;
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;
ifi=t
thenwriteln(i,'=',a,'^3+',b,'^3+',c,'^3');
i:
=i+1
untili>999
end.
VisualBasic的"水仙花数"实现代码:
FORTRAN的"水仙花数"实现代码:
WRITE(*,30)
DO10K=100,999
IA=K/100
IB=MOD(K,100)/10
IC=MOD(K,10)
IF(K.NE.IA**3+IB**3+IC**3)GOTO10
WRITE(*,20)K,IA,IB,IC
10CONTINUE
20FORMAT(5X,4I4)
30FORMAT(5X,18HN=I**3+J**3+K**3)
STOP
END
C++编译器上的水仙花数实现代码
#include
usingnamespacestd;
intmain()
{inta,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< return0;
}
pyhon中实现的代码
foriinrange(1,10):
forjinrange(0,10):
forkinrange(0,10):
ifi*100+j*10+k==i*i*i+j*j*j+k*k*k:
printi*100+j*10+k
Java中实现的代码
publicclassshuixianhuashu{
publicstaticvoidmain(String[]args){
for(inti=100;i<1000;i++){
inta=i/100;
intb=i/10%10;
intc=i%10;
if(Math.pow(a,3)+Math.pow(b,3)+Math.pow(c,3)==i)
System.out.println(i+"是水仙花数");
}
}
}
C#ASP.N中的实现代码
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(