導航:首頁 > 知識科普 > 有哪些巧妙的方法求水仙花數

有哪些巧妙的方法求水仙花數

發布時間:2022-09-18 14:25:35

Ⅰ 水仙花數求法 跪求指點

//求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]='';for(intj=0,k=DIGIT-1;j<DIGIT;j++,k--){ans[cnt1][k]=no[j]+'0';}s[cnt1]=ans[cnt1];v.push_back(s[cnt1]);cnt1++;}}};intmain()//計算從0——9出現分別0——DIGIT次時的值{for(inti=1;i<10;i++){num1[i][1][0]=1;intindex=0;for(intj=1;j<=DIGIT;j++){for(intr=0;r<=index;r++){num1[i][1][r]*=i;}for(intr=0;r<=index;r++){if(num1[i][1][r]>9){num1[i][1][r+1]+=(num1[i][1][r]/10);num1[i][1][r]%=10;}}while(index<DIGIT-1&&num1[i][1][index+1]>0){index++;if(num1[i][1][index]>9){num1[i][1][index+1]+=(num1[i][1][index]/10);num1[i][1][index]%=10;}}}for(intj=2;j<=DIGIT;j++){for(intr=0;r<=DIGIT;r++){num1[i][j][r]=num1[i][1][r]*j;}for(intr=0;r<DIGIT;r++){if(num1[i][j][r]>9){num1[i][j][r+1]+=(num1[i][j][r]/10);num1[i][j][r]%=10;}}}}//枚舉0——9分別出現0——DIGIT次的情況,0——9分別對應a——jfor(inta=0;a<=DIGIT;a++){Count[0]=a;for(intb=0;b<=DIGIT;b++){if(a+b>DIGIT)//保證出現的次數不大於DIGIT,下同{break;}Count[1]=b;for(intc=0;c<=DIGIT;c++){if(a+b+c>DIGIT){break;}Count[2]=c;for(intd=0;d<=DIGIT;d++){if(a+b+c+d>DIGIT){break;}Count[3]=d;for(inte=0;e<=DIGIT;e++){if(a+b+c+d+e>DIGIT){break;}Count[4]=e;for(intf=0;f<=DIGIT;f++){if(a+b+c+d+e+f>DIGIT){break;}Count[5]=f;for(intg=0;g<=DIGIT;g++){if(a+b+c+d+e+f+g>DIGIT){break;}Count[6]=g;for(inth=0;h<=DIGIT;h++){if(a+b+c+d+e+f+g+h>DIGIT){break;}Count[7]=h;for(inti=0;i<=DIGIT;i++){if(a+b+c+e+f+g+h+i>DIGIT){break;}Count[8]=i;intj=DIGIT-a-b-c-d-e-f-g-h-i;if(j<0){break;}Count[9]=j;deal();}}}}}}}}}//排序,將答案從小到大輸出sort(v.begin(),v.end());for(inti=0;i<v.size();i++){cout<<v[i]<<endl;}return0;}

Ⅳ 求水仙花數最速求解演算法

/*
128468643043731391252
449177399146038697307*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

/*
128468643043731391252
449177399146038697307*/
//我的程序只用了34秒
//乍一下很難,很容易往那個一位位枚舉數字的方向去,但是這樣的復雜度很高,盡管加上了一些判斷還是於事無補
//我說一下思路吧,先把所有的數字的21次方求出來放在一個數組里保存,然後再去枚舉每一個數字有幾個,
//總共加起來是二十一位數字,這個枚舉的操作次數相對剛才的那個是小多了,
//然後把這些數的21次方加起來,然後再去判斷一下,是不是由這些數字組成就行了

const int BIT=100000000;
struct BigNum
{
int dig[6];
int len;
void Clr()
{
memset(dig,0,sizeof(dig));
len=1;
}
void Print()
{
int i;
printf("%d",dig[len-1]);
for(i=len-2;i>=0;i--)
printf("%08d",dig[i]);
puts("");
}
};
BigNum p[10],MAX,MIN;
BigNum sp[10][22];
int take[10]={0};
int LEN=21;
int GetLen(BigNum a)
{
int i;
for(i=5;i>0&&a.dig[i]==0;i--);
return i+1;
}
BigNum CarryUp(BigNum a)
{
int i;
for(i=0;i<a.len;i++)
{
a.dig[i+1]+=a.dig[i]/BIT;
a.dig[i]%=BIT;
}
return a;
}
BigNum Multi(BigNum a,BigNum b)
{
BigNum c;
int i,j,k;
c.Clr();
c.len=a.len+b.len;
for(i=0;i<a.len;i++)
{
for(j=0;j <b.len;j++)
{
c.dig[i+j]+=a.dig[i]*b.dig[j];
}
}
c=CarryUp(c);
if(c.len>0&&c.dig[c.len-1]==0)c.len--;
return c;
}
BigNum MyPow(BigNum a,int n)
{
BigNum ret;
ret.Clr();
ret.dig[0]++;
while(n--)
{
ret=Multi(ret,a);
}
return ret;
}
int Cmp(BigNum a,BigNum b)
{
if(a.len>b.len)return 1;
if(a.len<b.len)return -1;
int i;
for(i=a.len-1;i>=0&&a.dig[i]==b.dig[i];i--);
if(i==-1)return 0;
return a.dig[i]-b.dig[i];
}
BigNum Add(BigNum a,BigNum b)
{
int i;
if(b.len>a.len)a.len=b.len;
for(i=0;i<a.len;i++)
{
a.dig[i]+=b.dig[i];
}
a=CarryUp(a);
if(a.dig[a.len])a.len++;
return a;
}
BigNum Deal(BigNum a)
{
int i;
BigNum b;
b.Clr();
b.len=3;

for(i=7;i>=0;i--)
{
b.dig[0]=b.dig[0]*10+a.dig[i];
}
for(i=15;i>=8;i--)
{
b.dig[1]=b.dig[1]*10+a.dig[i];
}
for(i=23;i>=16;i--)
{
b.dig[2]=b.dig[2]*10+a.dig[i];
}
return b;
}
bool ok(BigNum sum)
{
int aa[10]={0};
int i;
for(i=0;i<8;i++)
{
aa[sum.dig[0]%10]++;
aa[sum.dig[1]%10]++;
sum.dig[0]/=10;
sum.dig[1]/=10;
}
for(i=0;i<5;i++)
{
aa[sum.dig[2]%10]++;
sum.dig[2]/=10;
}
for(i=0;i<10&&aa[i]==take[i];i++);
return i==10;
}
void DFS(int deep,BigNum Sum,int leave)
{
BigNum check;
BigNum cc;
int i;
if(deep==10)
{
if(leave>0)return;

if(ok(Sum))
{
Sum.Print();
}
return ;
}

for(i=0;i<=leave;i++)
{
take[deep]=i;
check=Add(Sum,sp[deep][i]);
if(Cmp(check,MAX)>=0)break;
cc=Add(check,sp[9][leave-i]);
if(Cmp(cc,MIN)<0)continue;
DFS(deep+1,check,leave-i);
}
}
int main()
{
int i;
int j;
BigNum tmp;
BigNum sum;
tmp.Clr();
int start=time(NULL),finish;

for(i=0;i<10;i++)
{
p[i]=MyPow(tmp,LEN);
tmp.dig[0]++;
}
for(i=0;i<10;i++)sp[i][0].Clr();
for(j=0;j<10;j++)
for(i=1;i<22;i++)
{
sp[j][i]=Add(sp[j][i-1],p[j]);
}
tmp.Clr();
tmp.len=LEN;

sum.Clr();
MAX.dig[2]=100000;
MAX.len=3;
MIN.dig[2]=10000;
MIN.len=3;
DFS(0,sum,LEN);
finish = time(NULL);
printf("%d\n",(finish-start));
return 0;
}

Ⅳ 用更簡便方法求水仙花數

#include<stdio.h>
#include<math.h>
intmain()
{
intm,n,i,sum,tmp,pows;
intd=0;
scanf("%d%d",&m,&n);
if(m<100)m=100;//100以內沒有
for(i=m;i<=n;i++)
{
inta=i;
sum=0;
pows=0;
while(a){//計算位數
tmp=a%10;
a=a/10;
++pows;
}
a=i;
while(a){//計算和
tmp=a%10;
sum+=pow(tmp,pows);
a=a/10;
}
if(i==sum){
printf("%d ",i);
d++;
}
}
if(d==0)
printf("no");
return0;

}

計算結果:

6 10000
153
370
371
407
1634
8208
9474
Press any key to continue

LS的只能計算100-1000的數

Ⅵ 水仙花數計算方法什麼

水仙花數計算方法:是指一個
n
位數
(
n≥3
),它的每個位上的數字的
n
次冪之和等於它本身。(例如:1^3
+
5^3
+
3^3
=
153)
水仙花數計算方法,是一種程序代碼用的方法。好比C語言,Java之類的軟體。

Ⅶ 計算機演算法水仙花怎麼算!急啊

C語言水仙花數(詳解版)

問題描述

輸出所有的「水仙花數」,所謂的「水仙花數」是指一個三位數其各位數字的立方和等於該數本身,例如153是「水仙花數」,因為:153 = 13 + 53 + 33。

問題分析

根據「水仙花數」的定義,判斷一個數是否為「水仙花數」,最重要的是要把給出的三位數的個位、十位、百位分別拆分,並求其立方和(設為s),若s與給出的三位數相等, 三位數為「水仙花數」,反之,則不是。

演算法設計

「水仙花數」是指滿足某一條件的三位數,根據這一信息可以確定整數的取值范圍是 100〜999。對應的循環條件如
下:
for(n=10; n<1000; n++){ //......}

對代碼的說明:將n整除以100,得出n在百位上的數字hun。將(n-i*100)整除以10(或將n先整除以10再對10求模n/10%10),得出n在十位上的數字ten。將n對10取余,得出n在個位上的數字ind。求得這三個數字的立方和是否與其本身相等,若相等,則該數為水仙花數。
對於每個位置上的數值將其拆分的演算法有很多種,根據不同情況選擇不同演算法(對於同一問題不同演算法的效率有時會相差很多)。

下面是完整的代碼:

#include <stdio.h>
int main()
{ int hun, ten, ind, n; printf("result is:");
for( n=100; n<1000; n++ ) /*整數的取值范圍*/
{ hun = n / 100; ten = (n-hun*100) / 10;
ind = n % 10;
if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind) /*各位上的立方和是否與原數n相等*/ printf("%d ", n); } printf("\n"); return 0;}
以上資料來自網上僅供參考.

Ⅷ 水仙花數計算方法是什麼

水仙花數計算方法:是指一個 n 位數 ( n≥3 ),它的每個位上的數字的 n 次冪之和等於它本身。(例如:1^3 + 5^3 + 3^3 = 153)

Ⅸ 求三位數水仙花數

水仙花數是指一個 n 位數 ( n≥3 ),它的每個位上的數字的 n 次冪之和等於它本身。

三位的水仙花數共有4個:153,370,371,407;

加一下就可以了,

153+370+371+407=1301

C語言:

#include <stdio.h>

int main(void)

{

int a,b,c;

for(a=1;a<=9;a++)

for(b=0;b<=9;b++)

for(c=0;c<=9;c++)

if(100*a+10*b+c==a*a*a+b*b*b+c*c*c)

printf("%d%d%d\n",a,b,c);

return 0;

}

Ⅹ 求水仙花數,三位數內,我用C寫了一個,求高手看看還有更簡單的方法沒,或者請幫我把程序精簡一下,謝謝啦

#include "stdio.h"
void s(int shu)
{
int g,h,b;
for(shu=100;shu<=999;shu++)
{
g=shu%10;
h=shu/10%10;
b=shu/100;
if(shu==g*g*g+h*h*h+b*b*b)
printf("%d\t",shu);
}
}
void main()
{
int a;
printf("水仙花數有:");
s(a);
}

閱讀全文

與有哪些巧妙的方法求水仙花數相關的資料

熱點內容
益節美國氨糖食用方法 瀏覽:559
飛利浦溫奶器使用方法 瀏覽:923
FDMS顆粒物測量方法 瀏覽:775
2015新君威後備箱進水解決方法 瀏覽:929
北京標桿企業調研方法有哪些 瀏覽:113
鉛筆生活技巧和方法 瀏覽:537
煙氣控制方法有哪些 瀏覽:693
中葯分析驗證方法 瀏覽:917
解決代溝的有效方法 瀏覽:693
王伯彤比特訓練方法 瀏覽:87
腦袋上毛囊炎最好治療方法 瀏覽:231
炒股的股利計算方法 瀏覽:751
傳統生態學研究方法 瀏覽:443
認土鴨子的方法視頻 瀏覽:201
栽種豆角更簡便的方法 瀏覽:64
六字訣快速練習方法 瀏覽:856
獲得金屬單質常用的方法 瀏覽:318
用什麼方法止癢好 瀏覽:633
瘦肚子後背運動方法視頻 瀏覽:188
冬天怎麼除甲醛最快最有效的方法 瀏覽:479