Ⅰ 水仙花数求法 跪求指点
//求1到100000的水仙花数
public class NarcissisticNumber {
public static void main (String [] args) {
int count = 0;
for(int i=1; i<=100000; i++) {
if(judge(i) == true) {
count++;
System.out.print(i + " "); // 1 153 370 371 407
}
}
System.out.println();//换行
System.out.println("一共有 " + count + " 个水仙花数.");
}
//判断一个数是否为水仙花数
public static boolean judge (int number) {
int count = String.valueOf(number).length() - 1;
//求出number的长度,如4位,则对应是10的3次方, 10的count次方
int level = 0; //每一个位数
int sum = 0; //每一个位数的三次方的和
boolean b = false; //默认为false,即默认为非水仙花数
int temp = number; //从高位到低位逐位截取,即4位数变位3位数,3位数变为2位数...
while (count >= 0) {
level = temp / ((int)Math.pow(10,count));
sum = sum + (int)Math.pow(level,3);
temp = temp % ((int)Math.pow(10,count)); //由千位数变位百位,百位变为十位...
count--;
}
if(sum == number) { //是水仙花数
return (b = true);
}
return b; //不是水仙花数,b默认为false
}
}
Ⅱ 求三位数水仙花数的算法怎么设计
算法是从100到999中依次取出1个三位数进行枚举水仙花数判断,第一步:求出这个三位数的百位、十位、个位的数字分别存在3个变量中, 例如:三位数321,百位3存在x中,十位2存在y中,个位1存在
Ⅲ 水仙花数的求取方法(非高精度)
以下为在各种编程语言中实现求取水仙花数的方法(非高精度)。 program narcissistic_number;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 narcissistic_number;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 narcissistic_number;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. C Print all the Narcissistic numberC between 100 and 999
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,IC10 CONTINUE20
FORMAT(5X,4I4)30
FORMAT(5X,18HN=I**3+J**3+K**3)
STOP
END <%
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
方法二:
(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. 1-999999之间
REM Print all the Narcissistic numberREM between 1 and 999999FOR 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 iENDPB 实现的方法(只计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 (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)) endend; (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
方法二(可现不定位数解):
n=Input[请输入大于2的自然数n:];
For[i=10^(n-1),i<10^n-1,i++,
If[Total[IntegerDigits^IntegerLength]==i,
Print]]
BASH 脚本实现计算100-999之内数#!/bin/bashfor (( 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 $number1 fi done donedone易语言代码 求指定范围内水仙花数
.版本 2
.子程序 取出水仙花数, 整数型, , 返回范围内水仙花数个数,如果范围过大将会十分耗时
.参数 起始数字, 整数型, , 从此数开始判断是否为水仙花数
.参数 结束数字, 整数型, , 此数必须大于起始数字
.参数 保存得到水仙花数的数组, 整数型, 可空 数组
.局部变量 数字数组, 文本型, , 0
.局部变量 水仙花数, 整数型, , 0
.局部变量 总和, 整数型
.局部变量 计次, 整数型
.局部变量 计次2, 整数型
.如果真 (起始数字 > 结束数字)
清除数组 (保存得到水仙花数的数组)
返回 (0)
.如果真结束
.变量循环首 (起始数字, 结束数字, 1, 计次)
.计次循环首 (取文本长度 (到文本 (计次)), 计次2)
加入成员 (数字数组, 取文本中间 (到文本 (计次), 计次2, 1))
处理事件 ()
.计次循环尾 ()
.计次循环首 (取数组成员数 (数字数组), 计次2)
总和 = 总和 + 求次方 (到数值 (数字数组 [计次2]), 取文本长度 (到文本 (计次)))
处理事件 ()
.计次循环尾 ()
.如果真 (总和 = 计次)
加入成员 (水仙花数, 计次)
.如果真结束
处理事件 ()
.变量循环尾 ()
保存得到水仙花数的数组 = 水仙花数
返回 (取数组成员数 (水仙花数))
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 p (?)
stack ends
data segment
buf db 3 p (?)
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 思想:枚举n位数字中0——9出现的次数,根据枚举的次数算出一个数,对比这个数中0——9出现的次数是否等于枚举的0——9出现的次数相等。如果相等,则该数是水仙花数。 #include<stdio.h>#include<string.h>#include<vector>#include<string>#include<iostream>#include<algorithm>usingnamespacestd;#defineDIGIT21//每次就只用改变这里,就可以算出不同位数的水仙花数了。如果要想算出所用的,这里就写最大,然后再在程序里加一层循环就是咯intCount[10];//Count用来保存枚举是0——9出现的次数,用以和算出来的值各数字出现次数进行对比。intcnt1,num1[10][DIGIT+1][DIGIT+1];//cnt1是符合条件的个数。num1用来保存0——9分别出现0——DIGIT次对应的答案charans[10][DIGIT+1];//保存符合条件的答案//这两个就是为了排序方便一点vector<string>v;strings[10];voiddeal(){intcnt[10];//保存算出来的数0——9出现的次数,用以和Count对比看是否满足条件intno[DIGIT+1];//算出来的数memset(no,0,sizeof(no));memset(cnt,0,sizeof(cnt));for(intk=1;k<10;k++){if(num1[k][Count[k]][DIGIT]!=0){return;}for(inti=0;i<DIGIT;i++){no[i]+=num1[k][Count[k]][i];if(no[i]>9){no[i+1]+=(no[i]/10);no[i]%=10;}}}if(no[DIGIT]!=0){return;}if(no[DIGIT-1]!=0){intflag=0;for(intj=0;j<DIGIT;j++){cnt[no[j]]++;}for(intj=0;j<10;j++){if(cnt[j]!=Count[j]){flag=1;break;}}if(!flag){ans[cnt1][DIGIT]='