没有合适的资源?快使用搜索试试~ 我知道了~
国信蓝点杯第二届决赛最后一题, 代码长度比较长,但是简单易懂,执行时间20多秒
资源推荐
资源详情
资源评论
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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();//计时开始
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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<<ans<<endl;
count++;
if(count==2)
{
int end = clock();
cout<<"用时:"<<end - start<<"毫秒"<<endl;
return;
}
}
break; //因为i0+i9的次数已经是21次了,如果再多一次的话那肯定就超过了21次...所以直接跳出循环..
剩余13页未读,继续阅读
资源评论
Holi
- 粉丝: 3
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功