在各种编程语言中实现求取水仙花数的方法(非高精度)。
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秒超时,可以开启本控制
//定义位数
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('错误的位数'); //提示错误的位数
}
}
语言的"水仙花数"实现代码
#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);
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;
}
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 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;
}
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+k
Java 中实现的代码
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;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
方法二,
(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<<"\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