當前位置:首頁 » 操作系統 » 求水仙花數的演算法

求水仙花數的演算法

發布時間: 2022-07-15 19:08:13

c語言水仙花數演算法

#include<stdio.h>
intmain()
{
inti,j,k,n;
printf("水仙花數是:");
for(n=100;n<=999;n++)
{
i=n/100;
j=n%100/10;
k=n%10;
if(n==i*i*i+j*j*j+k*k*k)//=改為==
//printf("%d",n);
//printf("");//以上兩句合並為下面這一句,否則會有大量空格
printf("%d",n);
}
return0;}

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

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

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

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;}
以上資料來自網上僅供參考.

編程 求水仙花數

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

  2. C語言代碼

#include<stdio.h>
#include<stdlib.h>
voidmain()
{
inti,j,k,n;
printf("'waterflower'numberis:");
for(n=100;n<10000;n++)
{
i=n/100;/*分解出百位*/
j=n/10%10;/*分解出十位*/
k=n%10;/*分解出個位*/
if(n==i*i*i+j*j*j+k*k*k)
{
printf("%-5d",n);
}
}
printf(" ");
}

3. C++代碼

#include<iostream>
usingnamespacestd;
intf(intx)
{inty=1;
for(inti=1;i<=3;i++)
y=y*x;
returny;}
intmain()
{
for(inti=100;i<=999;i++)
{if(f(i%10)+f(i/10%10)+f(i/100%10)==i)
cout<<i<<endl;}
return0;
}

java中求解水仙花數的演算法思想是什麼

水仙花數是指一個
n
位數
(
n≥3
),它的每個位上的數字的
n
次冪之和等於它本身。
從上面的定義可以看出,只要將給出的數字各個位數的數字分解出來,然後把個數字的3次方相加與原數相比是否相等即可判斷出是否為水仙花數,給你一段源碼,是求100~1000內的水仙花數,有注釋,希望對你有幫助:
public
class
Wflower
{
public
static
void
main(String[]
args)
{
int
a=0,b=0,c=0;
System.out.println("水仙花數是:");
for
(int
i
=
100;
i
<
1000;
i++)
//遍歷所有3位數
{
a
=
i/100;
//獲取3位數中百位的數
b=i%100/10;
//獲取3位數中十位的數
c=i%100%10;
//獲取3位數中個位的數
a
=
a
*
a
*
a;
//計算第一位數的立方
b
=
b
*
b
*
b;
//計算第二位數的立方
c
=
c
*
c
*
c;
//計算第3位數的立方
if
((a
+
b
+
c)
==
i)
//如果符合水仙花數
System.out.print("
"+i);
}
}
}

㈥ 求三位數水仙花數的演算法怎麼設計

演算法是從100到999中依次取出1個三位數進行枚舉水仙花數判斷,第一步:求出這個三位數的百位、十位、個位的數字分別存在3個變數中, 例如:三位數321,百位3存在x中,十位2存在y中,個位1存在

㈦ c語言 用兩種演算法求解所有的水仙花數

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
intmain(void)
{
doublen,k,t1,t2,t3,ge,shi,,qian,wan,shiwan,wan,qianwan,yi,shiyi;
inti,m,a;FILE*p;p=fopen("123.txt","a");t1=t2=t3=0;inty,b,c,j;
clock_tstart,finish,shi,zhong,kkk,mmm;
k=t1=t2=ge=shi==qian=wan=0;a=i=0;n=3;
m=9;
printf("水仙花數是指一個N位正整數(N≥3),它的每個位上的數字的N次冪之和等於它本身。 ");
printf("例如:153=1^3+5^3+3^3。而本程序將探索9位以內的水仙花數 ");
printf("本次運算將會保存結果為123.txt到本程序根目錄下 ");
system("pause");
kkk=clock();
onceagain:
i=10;a++;
printf("第%d回合開始: ",a);
printf("本次計算%.0lf位的水仙花數 ",n);
fprintf(p," %.0lf位水仙花數:",n);
shi=clock();
for(;;)
{
i++;
if(i==11){start=clock();}
if(n==3&&i==11){i=100;}
if(n==4&&i==11){i=1000;}
if(n==5&&i==11){i=10000;}
if(n==6&&i==11){i=100000;}
if(n==7&&i==11){i=1000000;}
if(n==8&&i==11){i=10000000;}
if(n==9&&i==11){i=100000000;}
y=i;k=0;
do{
c=y%10;
y=y/10;
j=1;
b=c;
while(j<n)
{
b=b*c;
j++;
}
k=k+b;
}while(y>0);
/*ge=i/1%10;
shi=i/10%10;
=i/100%10;
qian=i/1000%10;
wan=i/10000%10;
shiwan=i/100000%10;
wan=i/1000000%10;
qianwan=i/10000000%10;
yi=i/100000000%10;
shiyi=i/1000000000%10;*/
/*k=pow(ge,n)+pow(shi,n)+pow(,n)+pow(qian,n)+pow(wan,n);
k=pow(shiwan,n)+pow(wan,n)+pow(qianwan,n)+pow(yi,n)+pow(shiyi,n)+k;*/
/*如上被注釋成偽代碼的部分是第一代代碼,效率低*/
if(k==i){finish=clock();t1=(double)(finish-start)/CLOCKS_PER_SEC;start=clock();}
if(k==i){printf("%.0lf算出該答案耗時:%.3lf秒 ",k,t1);}
if(k==i){fprintf(p," %.0lf算出該答案耗時:%.3lf秒",k,t1);}
if(n==3&&i>999){break;}
if(n==4&&i>9999){break;}
if(n==5&&i>99999){break;}
if(n==6&&i>999999){break;}
if(n==7&&i>9999999){break;}
if(n==8&&i>99999999){break;}
if(n==9&&i>999999999){break;}
}
zhong=clock();t2=(double)(zhong-shi)/CLOCKS_PER_SEC;
printf("第%d回合結束,本次運行共耗時%.3lf秒 ",a,t2);
fprintf(p," 本次運行共耗時%.3lf秒 ",t2);
if(n<m){n++;gotoonceagain;}
else
{mmm=clock();t3=(double)(mmm-kkk)/CLOCKS_PER_SEC;printf("本次程序完成所有任務共耗時%.3lf秒 ",t3);fprintf(p," 本次運行共耗時%.3lf秒 ",t3);
system("pause");
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;
}

㈨ 求水仙花數的演算法

Narc = []
a=100
while a<1000:
if a == (a // 100)**3+(a // 10 % 10)**3+(a % 10)**3:
Narc.append(a)
a += 1
print(Narc)

python3 程序

熱點內容
db2plsql 發布:2025-01-22 08:19:10 瀏覽:778
豬豬俠腳本沒反應 發布:2025-01-22 08:08:37 瀏覽:811
賽博朋克跟永劫無間哪個配置高 發布:2025-01-22 08:07:07 瀏覽:534
請盡快上傳 發布:2025-01-22 08:06:22 瀏覽:188
河北編程培訓 發布:2025-01-22 08:01:42 瀏覽:591
a星演算法視頻 發布:2025-01-22 07:55:01 瀏覽:878
快手安卓怎麼直播 發布:2025-01-22 07:54:58 瀏覽:937
買伺服器搭建vpn 發布:2025-01-22 07:53:21 瀏覽:808
路由器忘記密碼如何解 發布:2025-01-22 07:38:47 瀏覽:154
5分鍾視頻編譯 發布:2025-01-22 07:36:33 瀏覽:772