当前位置:首页 » 操作系统 » 求水仙花数的算法

求水仙花数的算法

发布时间: 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 程序

热点内容
怎样编程选股 发布:2025-02-02 08:22:02 浏览:415
电脑web应用服务器 发布:2025-02-02 08:05:31 浏览:811
电脑存储内存多少合适 发布:2025-02-02 08:00:15 浏览:110
登录界面android 发布:2025-02-02 07:53:23 浏览:841
编译时注解与运行时注解 发布:2025-02-02 07:53:14 浏览:818
怎样登陆ftp 发布:2025-02-02 07:44:44 浏览:637
疯狂点击脚本 发布:2025-02-02 07:38:10 浏览:73
pss算法 发布:2025-02-02 07:30:55 浏览:748
发信息脚本 发布:2025-02-02 07:03:07 浏览:741
l2l3缓存 发布:2025-02-02 06:56:47 浏览:524