- 浏览: 99316 次
-
文章分类
最新评论
在各种编程语言中实现求取水仙花数的方法(非高精度)
在各种编程语言中实现求取水仙花数的方法(非高精度)。
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;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
方法二,
(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
相关推荐
“水仙花数”是三位数中特殊的数,其各个位数的立方和等于自身。这需要理解位数分离和幂运算。 #### 9. 输入一个三位数,反向输出 主要考察了数学运算(如模运算`%`和整除`/`)和逻辑控制。通过逐步提取原数的个位...
水仙花数是一个典型的数学问题,在编程中需要通过对数字进行操作来找到满足特定条件的数。在提供的答案中,通过三层嵌套循环遍历了所有三位数,并计算每个数的每位数字的立方和,判断其是否等于原数。这种方法虽然...
C语言是一种广泛应用于系统编程、应用编程、嵌入式开发等领域的高级编程语言,它的语法简洁、效率高,是学习计算机编程的基础。本压缩包"**C语言要点综合.zip**"包含了一些关键知识点的说明,旨在帮助初学者或进阶者...
1. **水仙花数**:水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。编程时,可以通过循环遍历100到999,计算每个数的各位数字立方和来找出水仙花数。 ...
C语言是一种中级编程语言,适用于系统开发、嵌入式系统以及各种软件应用程序。 2. **考试形式与时间**:考试形式为闭卷,意味着考生不能参考任何资料。考试时间为120分钟,要求学生在规定时间内完成所有题目。 3. ...
6. **水仙花数的求解**:水仙花数的计算展示了如何处理三位数的每一位数字,并使用立方和进行比较。循环遍历100到999之间的数字,通过计算每个位的立方和并检查是否等于原数。 7. **素数求解**:素数是指大于1且...
求水仙花数是指一个三位数,其各位数字的立方和等于原数,这可以帮助你学习位运算和条件判断。求完数是指一个数恰好等于它的所有真因数之和,这个例子有助于理解因数和整数性质。最后,打印*组图案展示了如何利用...
- 水仙花数的概念:一个三位数,其各位数字立方和等于该数本身。 - 如何通过循环结构计算一个三位数的各位数字。 - 实现水仙花数判断的算法逻辑。 #### 题目四:质因数分解 - **知识点**: - 质因数分解的概念...
最后一个问题是寻找水仙花数,即找出所有三位数中,每个位数上的数字立方和等于该数本身的数。这里运用了for循环来遍历所有的三位数,并对每个数进行位数分解和计算。该问题让学生能够实践如何使用循环来解决具体的...
26. 水仙花数:三位数中,每一位上的数字立方和等于该数本身。 这些题目覆盖了C语言的基础和进阶应用,是学习和提升C语言编程能力的好素材。通过解答这些问题,可以深入理解C语言的语法和编程思维。
12. **水仙花数**:【程序13】的三位数判断,考察位数操作和条件判断。 13. **质因数分解**:【程序14】展示了如何分解一个数的质因数。 14. **条件运算符**:【程序15】的条件运算符嵌套,用于根据成绩输出不同等级...
26. **水仙花数**:判断三位数的每一位平方和是否等于其本身。 这些题目旨在检验和提升C++编程的基本技能,包括控制结构、算术运算、逻辑判断、数据结构和算法的应用。通过解决这些问题,学习者能够深入理解和熟练...
### J2SE学习笔录知识点... - **示例:求水仙花数** - 水仙花数是指一个三位数,其各位数字立方和等于该数本身。 通过这些知识点的学习,开发者能够建立起对Java语言的基础理解,并为进一步深入学习打下坚实的基础。
12. **水仙花数**:一个数的每一位立方和等于它本身,如153(1^3 + 5^3 + 3^3 = 153)。 13. **文本加密**:读取文件内容,逐字符加上指定偏移量,再写回文件。 14. **链表操作**:创建链表、插入节点、删除节点等...