- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 43420
- 在线时间
- 小时
|
发表于 2009-1-12 17:26:57
|
显示全部楼层
我倒是觉得可以批量一起搜索多个幂的情况,比如-
- #define MAX_TIMES 30
- int TIMES=20;
-
- int cc[MAX_TIMES+1];
-
- void check(integer& x,integer& y, int k)
- {
- LPCTSTR s=y.GetStr(FS_NORMAL);
- int i;
- int count[10];
- int tc=0;
- for(i=0;i<10;i++)count[i]=0;
- for(i=0;s[i]!='\0';i++){
- if('0'<=s[i]&&s[i]<='9'){
- int h=s[i]-'0';
- count[h]++;tc++;
- if(count[h]>k)return;
- }
- }
- if(count[0]+10*k-tc!=k)return;
- cc[k]++;
- printf("%s^%d=%s\n",x.GetStr(FS_NORMAL),k,s);
- fflush(stdout);
- }
- integer yt[MAX_TIMES+1];
- char buf1[1000];
- char buf2[1000];
- void test()
- {
- time_t t=time(NULL);
- integer x(1);
- long long u=1LL;
- int i,mt;
- int c=0;
- for(i=0;i<10;i++){
- x*=10;
- u*=10LL;
- }
- integer y(x);
- y/=10;
- for(i=1;i<=MAX_TIMES;i++){
- yt[i]=y;
- y*=x;
- }
- x--;u--;
- mt=MAX_TIMES;
- for(;u>0LL;x-=3,u-=3LL){
- integer z(x);
- for(i=2;i<=mt;i++){
- z*=x;
- strcpy(buf1,z.GetStrA(FS_NORMAL,NULL));
- strcpy(buf2,yt[i].GetStrA(FS_NORMAL,NULL));
- if(z<yt[i]){mt=i-1;break;}
- check(x,z,i);
- }
- if(i<=2)break;
- c++;
- if(c%100000==0){
- time_t now=time(NULL);
- fprintf(stderr,"%lld, times %ds\n",u,(int)(now-t));
- }
- }
- t=time(NULL)-t;
- printf("Total cost %dseconds\n",t);
- }
-
- int main(int argc, char* argv[])
- {
- int i;
- test();
- for(i=2;i<=MAX_TIMES;i++){
- printf("c[%d]=%d\n",i,cc[i]);
- }
- return 0;
- }
复制代码 |
|