词条 | 水仙花数 |
释义 | 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153) 求取方法(非高精度)(PHP “水仙花数”实现代码: PHP 所有位数 理论输出: C 语言的"水仙花数"实现代码: PASCAL 实现代码: FORTRAN 的"水仙花数"实现代码: C++ 编译器上的水仙花数实现代码 pyhon 中实现的代码 Java 中实现的代码 C# ASP.N 中的实现代码 补充C#水仙花数实现代码(不定位数) javascript +html 实现可变位数的运算: asp 中实现的代码 Visual FoxPro 用表单实现法(只计3位) PB 实现的方法(只计3位数) ActionScript实现的方法(只计3位数) Delphi实现的方法(100-999) MATLAB中实现的方法(100-999) Mathematica实现方法(可现不定位数解) 添加一种C++的算法 BASH 脚本实现计算100-999之内数 vb代码 判断水仙花数 FreeBasic实现100~999之间的水仙花数) 什么是水仙花数水仙花数只是自幂数的一种,严格来说三位数的自幂数才成为水仙花数。 附:其他位数的自幂数名字 一位自幂数:独身数 两位自幂数:没有 三位自幂数:水仙花数 四位自幂数:四叶玫瑰数 五位自幂数:五角星数 六位自幂数:六合数 七位自幂数:北斗七星数 八位自幂数:八仙数 九位自幂数:九九重阳数 十位自幂数:十全十美数 常见水仙花数水仙花数又称阿姆斯特朗数。 三位的水仙花数共有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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。