而不是算完所有数的31次在算32次 能节约多少时间? 不过对每个幂, 其起始数字都不一样啊 看一下我的程序,其实方法很简单,就是对每个整数,计算它的最后一个幂就可以了。(如果某个整数,最后一个幂是h,那么所有比这个数小的,这个幂也不需要算了) 知道了
你们都倒着来 原帖由 无心人 于 2009-1-13 08:51 发表 http://bbs.emath.ac.cn/images/common/back.gif
能节约多少时间?
大部分幂运算都可以仅仅用一次乘法运算代替了,这部分时间可以节省。但是数字转化为10进制统计各位数字部分就不能节省了。具体节省多少时间要看两部分计算的比例。如果幂运算占大头,那么节省的运算量会非常客观。 乘以10位数
如果是64位机器
就简单了
可惜我的服务器内存低
不敢装64位
如果是2G或者4G我就装64位 你连续算20个幂
每亿数字消耗的时间是?
我这里似乎一个数字的时间在31后
大大增加了
原来估计20分,现在估计60分打不住
优化后的代码
改自 33# mathe 的代码:#include < stdio.h >#include < time.h >
#include < HugeCalc.h >
#include < HugeInt.h >
#pragma comment( lib, "HugeCalc.lib" )
#define integer CHugeInt
#define MIN_EXP 9
#define MAX_EXP 10
int cc = { 0 };
void test()
{
time_t t=time(NULL);
integer x("10000000002"), z;
int i, j, d;
int mt=MAX_EXP, c=33334;
int count;
int digits;
LPCTSTR p;
while( !(!( x-=3 )) )
{
z.Pow( x, MIN_EXP-1 );
for(i=MIN_EXP,d=i*10; i<=mt; i++,d+=10)
{
z*=x;
digits = z.GetDigits();
if ( digits == d )
{
count['\0']=1;
for(j='0';j<='9';j++)count=i+1;
for( p=z; 0!=--count[*p]; ++p)
;
if ( '\0' == *p )
{
printf("\nNo.%u\t%s^%d=%s\n\n", ++cc, (LPCTSTR)x, i, p-d);
fflush(stdout);
}
}
else if( digits < d )
{
mt=i-1;
if(mt<MIN_EXP)
{
printf("Total cost %dseconds\n", time(NULL)-t);
return;
}
break;
}
}
if( 0==--c )
{
fprintf(stderr,"\t%s, times %ds\n", (LPCTSTR)x, time(NULL)-t);
c = 300000;
}
}
}
int main(int argc, char* argv[])
{
int i;
test();
for(i=MIN_EXP;i<=MAX_EXP;i++){
printf("c[%d]=%d\n",i,cc);
}
return 0;
}