程序执行时间大概需要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