C语言求21位水仙花数.doc

上传人:自*** 文档编号:126223734 上传时间:2020-03-23 格式:DOC 页数:5 大小:45.45KB
返回 下载 相关 举报
C语言求21位水仙花数.doc_第1页
第1页 / 共5页
C语言求21位水仙花数.doc_第2页
第2页 / 共5页
C语言求21位水仙花数.doc_第3页
第3页 / 共5页
C语言求21位水仙花数.doc_第4页
第4页 / 共5页
C语言求21位水仙花数.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《C语言求21位水仙花数.doc》由会员分享,可在线阅读,更多相关《C语言求21位水仙花数.doc(5页珍藏版)》请在金锄头文库上搜索。

1、/*(编程题)花朵数一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。例如:当N=3时,153就满足条件,因为 13 + 53 + 33 = 153,这样的数字也被称为水仙花数(其中,“”表示乘方,53表示5的3次方,也就是立方)。当N=4时,1634满足条件,因为 14 + 64 + 34 + 44 = 1634。当N=5时,92727满足条件。实际上,对N的每个取值,可能有多个数字满足条件。程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。如果满足条件的数字不只有一个,请从小到大

2、输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。*/* 本程序比较容易理解。执行时间40秒左右(P6100处理器,2G内存,WIN7系统)。 思路: 任何一个水仙花数,比如153=13+53+33,里面包括1个1,1个5,1个3。如果是513,315,351这样的数字,虽然这几个不是水仙花数,但这几个数字中1,3,5出现的次数和水仙花数是一样的那么513,315,351这些数字,每位上数字的和应该就是水仙花数。如果是从1000-9999的枚举法,我想问题肯定大了。而如果采用上面的方法,这样的话,采用对数字出现次数进行枚举会让程序加

3、快很多。*/#include #include int num_time10=0; /num_time10用来得到0-9数字出现的个数int sum1021=(0,0),sumc1021=(0,0); /sum数组用来计算出0-9的21次方。sumc用来计算数字出现次数*它的21次方int count=0; /计算得到几个水仙花数了,得到2个以后就结束程序void initProgramm() /这个函数用来获得0-9的21次方,存在sum数组里int i,j,k;for(i=0;i10;i+) sumi20=i; for(k=2;k10;k+) for(i=1;i=0;j-) sumkj*=

4、k; for(j=20;j0;j-) sumkj-1+=sumkj/10; sumkj%=10; void check(int i0,int i1,int i2,int i3,int i4,int i5,int i6,int i7,int i8,int i9) /检测数字是不是水仙花数int i,j;int getAdd21=0; for(j=0;j21;j+) /把数字出现次数*它的21次方 sumc1j=sum1j*i1; sumc2j=sum2j*i2;sumc3j=sum3j*i3;sumc4j=sum4j*i4;sumc5j=sum5j*i5;sumc6j=sum6j*i6;sumc

5、7j=sum7j*i7;sumc8j=sum8j*i8;sumc9j=sum9j*i9; for(i=0;i0;j-) sumcij-1+=sumcij/10; sumcij%=10; for(i=0;i=0;j-) getAddj+=sumcij;for(i=20;i0;i-) /进位 getAddi-1+=getAddi/10; getAddi%=10; int j1=0,j2=0,j3=0,j4=0,j5=0,j6=0,j7=0,j8=0,j9=0,j0=0; for(i=20;i=0;i-) /用来判断和里面每个数字出现的次数switch(getAddi) case 0:j0+;bre

6、ak;case 1:j1+;break;case 2:j2+;break;case 3:j3+;break;case 4:j4+;break;case 5:j5+;break;case 6:j6+;break;case 7:j7+;break;case 8:j8+;break;case 9:j9+;break; /*如果一个数字,和里0-9出现的次数与这个数字里0-9出现的次数相同,那么和就应该是水仙花数(第一位数字不能为0)*/if(i0=j0)&(i1=j1)&(i2=j2)&(i3=j3)&(i4=j4)&(i5=j5)&(i6=j6)&(i7=j7)&(i8=j8)&(i9=j9)&(

7、getAdd0!=0)printf(n);count+;for(i=0;i21;i+)printf(%d,getAddi);printf(n);void main()int t,t1,t2;initProgramm();t1=time(NULL); int i0,i1,i2,i3,i4,i5,i6,i7,i8,i9;for(i9=0;i910;i9+) for(i0=1;i022;i0+)if(count=2) /出现2个水仙花数以后breakbreak;if(i9+i0=21) /几个数字的出现次数和为21以后就break,因为后面的数字出现次数和一定大于21,就超过了21位check(i0

8、,0,0,0,0,0,0,0,0,i9);break; for(i2=0;i222;i2+)if(count=2) break;if(i9+i0+i2=21)check(i0,0,i2,0,0,0,0,0,0,i9);break; for(i3=0;i322;i3+)if(count=2) break;if(i9+i0+i2+i3=21)check(i0,0,i2,i3,0,0,0,0,0,i9);break; for(i4=0;i422;i4+)if(count=2) break;if(i9+i0+i2+i3+i4=21)check(i0,0,i2,i3,i4,0,0,0,0,i9);bre

9、ak; for(i5=0;i522;i5+)if(count=2) break; if(i9+i0+i2+i3+i4+i5=21)check(i0,0,i2,i3,i4,i5,0,0,0,i9);break; for(i6=0;i622;i6+)if(count=2) break;if(i9+i0+i2+i3+i4+i5+i6=21)check(i0,0,i2,i3,i4,i5,i6,0,0,i9);break; for(i7=0;i722;i7+)if(count=2) break;if(i9+i0+i2+i3+i4+i5+i6+i7=21)check(i0,0,i2,i3,i4,i5,i6,i7,0,i9);break; for(i8=0;i822;i8+)if(count=2) break;if(i9+i0+i2+i3+i4+i5+i6+i7+i8=21)check(i0,0,i2,i3,i4,i5,i6,i7,i8,i9);break;for(i1=0;i122;i1+)if(count=2) break;if(i9+i0+i2+i3+i4+i5+i6+i7+i8+i1=21)check(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);break; t2=time(NULL); t=t2-t1; printf(n%d sn,t);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号