求解10位数以内的水仙花数:普通的穷举算法 另:优化的深度优先搜索算法。 (一)

2014-11-24 02:44:43 · 作者: · 浏览: 13

[cpp]
/*
水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。
(例如:1^3 + 5^3 + 3^3 = 153)
普通的穷举算法,
CPU0: Intel(R) Pentium(R)
CPU P6200 @ 2.13GHz
求解8位数以内的水仙花数需要45s左右的时间,

*/

/**
@author : 东海陈光剑 2013.4.26 Friday ,01:02

*/

#include
#include
#include

//#include

/* 求1-N 以内的水仙花数 */
#define N 1e8
//typedef enum {true = 0, false = !true} bool;

/**
打印日志时间
*/
void print_time()
{
time_t my_time; // time_t
/*
时间类型(time.h 定义)
struct tm -- 时间结构,time.h 定义如下:
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;

*/
struct tm* timeinfo;
time( &my_time );//获取时间,以秒计,从1970年1月一日起算,存于my_time
timeinfo = localtime( &my_time );//转为当地时间,tm 时间结构
//printf ( "\007The current date is: %s", asctime (timeinfo) );
/*asctime()-- 转为标准ASCII时间格式:星期 月 日 时:分:秒 年*/

printf ( "[%4d-%02d-%02d %02d:%02d:%02d]",
1900+timeinfo->tm_year,
1+timeinfo->tm_mon,
timeinfo->tm_mday,
timeinfo->tm_hour,
timeinfo->tm_min,
timeinfo->tm_sec);
/*
打印tm,tm_year 从1900年计算,所以要加1900,
月tm_mon,从0计算,所以要加1 */

}


/**
取数字位数
*/
int get_power_index(int n)
{

int power_index = 0;
while (n > 0)
{
power_index ++;
n /= 10;
}

return power_index;
}

/**计算数字各位上数字的k次方(k=数字的位数)*/

int my_pow(int* a, int* b)
{
int i=0;
int p=1;
//int pow = 1;
for (i = 0; i < *b; i++)
{
p *= *a;
}

return p;
}

/**判断x是否是水仙花数*/
int is_flower(int x)
{
int sum = 0;
int a = 0;
//int* pindex =NULL;
int pindex = get_power_index( x );
// int bits = power_index;
int n=x;

while (n > 0)
{
a = n % 10;
sum += my_pow( & a , & pindex);
n = (( n - n % 10 )/10);// n去尾
}


if (x == sum )
{
// printf(" %d 位数: ",*pindex);
return 0;
}
else
{
return 1;
}
}



int main()
{
// test
print_time();
printf("Testing....\nThe result is 9,625,010001000\n");
//printf("%c\n",ctime(gmtime()));
int a=5;
int b=4;
printf("%d\n",get_power_index(124667459));// 9
printf("%d\n",my_pow(&a,&b));// 625

printf("%d\n",is_flower(153));//0
printf("%d\n",is_flower(875));//1
printf("%d\n",is_flower(370));//0
printf("%d\n",is_flower(371));//0
printf("%d\n",is_flower(407));//0
printf("%d\n",is_flower(934));//1
printf("%d\n",is_flower(93084));//0
printf("%d\n",is_flower(92727));//0
printf("%d\n",is_flower(54748));//0


print_time();
printf("求1- %lf 以内的水仙花数.....\n",N);


int i;

clock_t start, finish;
double duration;

//printf("%c\n",ctime(gmtime()));

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

// 穷举算法
for(i=1;i {
if(is_flower(i) == 0)
{
printf("%d位数的水仙花:%d\n",get_power_index(i),i);
}
}

print_time();

finish = clock(); //计时结束

//printf("%c\n",ctime(gmtime()));

/* 测量一个事件持续的时间*/
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "Time using is %f seconds\n", duration );
//system("pause");

return 0;
}

/*
水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。
(例如:1^3 + 5^3 + 3^3 = 153)
普通的穷举算法,
CPU0: Intel(R) Pentium(R)
CPU P6200 @ 2.13GHz
求解8位数以内的水仙花数需要45s左右的时间,

*/

/**
@author : 东海陈光剑 2013.4.26 Friday ,01:02

*/

#i