用c语言编写花朵数程序,c语言21位花朵数(水仙花数)

程序执行时间大概需要25s

#include

#include

#include

#include

#include

using namespace std;

char *multi(char *p, char *q);//大乘法

void chushi();//将nums和value两个数组初始化

char *convert(int a);//将整形转换成字符型

void add(char* A0,char* A1,char* A2,char* A3,char* A4,char* A5,char* A6,char* A7,char* A8,char* A9,char* c);

//将A0 - A9全部加起来,结果放置到c中

bool judge(int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, char *p);

//判断i0 - i9枚举出现的次数跟p中出现的次数是否一致,如果一致则说明该数为水仙花数

char nums[10][22];//存放0-9的21次方

char value[10][22][80];//存放0-9出现次数的和,例如0如果在水仙花数中出现的次数为1次,则为0 , 或者2在水仙花数出现次数为2,则是

//2^21*2(2的21次方乘以2)以此类推..就可以得到

/**

* 0^21*0 0^21*1 0^21*2 0^21*3.......0^21*9

* 1^21*0 1^21*1 0^21*2..............1^21*9

* 2^21*0......按照这个规律下去,以便以后好使用

*/

void main()

{

//程序执行的时间大概需要25s左右

int start = clock();//计时开始

int count = 0;//已经知道了21位水仙花数有两个,所以当count==2的时候结束程序... 当然你也可以不这样,全部循环完大概要40s左右吧

chushi();

char ans[30];//存放水仙花数的

//用枚举的方法枚举出0-9在水仙花数中出现的次数...

//咋一看如此多代码,其实很好理解,将0 - 9 出现的次数分析出来,所以就写了10个循环...

for(int i9=0;i9<=9;i9++)//枚举从9开始,因为9出现的次数最多只能是9次,如果出现10次则9^21是22位数

{

for(int i0=0;i0<=20;i0++)//第一个不能为0,所以0出现的最多次数位20次,其余的皆可出现21次

{

if(i0+i9==21)

{

add(value[0][i0],value[1][0],value[2][0],value[3][0],value[4][0],value[5][0],value[6][0],value[7][0],value[8][0],value[9][i9],ans);

// 在这里就用到了先前存放的0 - 9出现次数的21次方,0出现了i0次,1出现了0次.....9出现了i9次。

if(ans[0]!='0' && judge(i0,0,0,0,0,0,0,0,0,i9,ans)) //ans[0]!='0'保证ans为21位

{

cout<

count++;

if(count==2)

{

int end = clock();

cout<

return;

}

}

break; //因为i0+i9的次数已经是21次了,如果再多一次的话那肯定就超过了21次...所以直接跳出循环..

}

for(int i1=0;i1<=21;i1++)

{

if(i0+i1+i9==21)

{

add(value[0][i0],value[1][i1],value[2][0],value[3][0],value[4][0],value[5][0],value[6][0],value[7][0],value[8][0],value[9][i9],ans);

if(ans[0]!='0' && judge(i0,i1,0,0,0,0,0,0,0,i9,ans))

{

cout<

t;

count++;

if(count==2)

{

int end = clock();

cout<

r

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值