找回密码
 欢迎注册
楼主: northwolves

[擂台] Ten digit numbers

[复制链接]
发表于 2009-1-13 08:47:18 | 显示全部楼层
那我算41-60吧。呵呵,我就用一台奔腾四
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 08:48:40 | 显示全部楼层
批量计算还是用我的那个方法比较好。比如你要计算31-40,那么对每个数先用幂运算算出31,然后每次再乘一个。
而不是算完所有数的31次在算32次
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 08:51:57 | 显示全部楼层
能节约多少时间?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 08:52:31 | 显示全部楼层
不过对每个幂, 其起始数字都不一样啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 08:55:56 | 显示全部楼层
看一下我的程序,其实方法很简单,就是对每个整数,计算它的最后一个幂就可以了。(如果某个整数,最后一个幂是h,那么所有比这个数小的,这个幂也不需要算了)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 08:57:28 | 显示全部楼层
知道了

你们都倒着来
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 08:57:59 | 显示全部楼层
原帖由 无心人 于 2009-1-13 08:51 发表
能节约多少时间?

大部分幂运算都可以仅仅用一次乘法运算代替了,这部分时间可以节省。但是数字转化为10进制统计各位数字部分就不能节省了。具体节省多少时间要看两部分计算的比例。如果幂运算占大头,那么节省的运算量会非常客观。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 09:11:05 | 显示全部楼层
乘以10位数
如果是64位机器
就简单了

可惜我的服务器内存低
不敢装64位
如果是2G或者4G我就装64位
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 09:13:04 | 显示全部楼层
你连续算20个幂
每亿数字消耗的时间是?

我这里似乎一个数字的时间在31后
大大增加了
原来估计20分,现在估计60分打不住
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-13 10:04:09 | 显示全部楼层

优化后的代码

改自 33# mathe 的代码
  1. #include < stdio.h >
  2. #include < time.h >
  3. #include < HugeCalc.h >
  4. #include < HugeInt.h >

  5. #pragma comment( lib, "HugeCalc.lib" )

  6. #define integer CHugeInt


  7. #define MIN_EXP    9
  8. #define MAX_EXP    10

  9. int cc[MAX_EXP+1] = { 0 };

  10. void test()
  11. {
  12.     time_t t=time(NULL);
  13.     integer x("10000000002"), z;
  14.     int i, j, d;
  15.     int mt=MAX_EXP, c=33334;
  16.     int count[256];
  17.     int digits;
  18.     LPCTSTR p;

  19.     while( !(!( x-=3 )) )
  20.     {
  21.         z.Pow( x, MIN_EXP-1 );
  22.         for(i=MIN_EXP,d=i*10; i<=mt; i++,d+=10)
  23.         {
  24.             z*=x;

  25.             digits = z.GetDigits();
  26.             if ( digits == d )
  27.             {
  28.                 count['\0']=1;
  29.                 for(j='0';j<='9';j++)count[j]=i+1;

  30.                 for( p=z; 0!=--count[*p]; ++p)
  31.                     ;

  32.                 if ( '\0' == *p )
  33.                 {
  34.                     printf("\nNo.%u\t%s^%d=%s\n\n", ++cc[i], (LPCTSTR)x, i, p-d);
  35.                     fflush(stdout);
  36.                 }
  37.             }
  38.             else if( digits < d )
  39.             {
  40.                 mt=i-1;
  41.                 if(mt<MIN_EXP)
  42.                 {
  43.                     printf("Total cost %dseconds\n", time(NULL)-t);
  44.                     return;
  45.                 }

  46.                 break;
  47.             }
  48.         }

  49.         if( 0==--c )
  50.         {
  51.             fprintf(stderr,"\t%s, times %ds\n", (LPCTSTR)x, time(NULL)-t);
  52.             c = 300000;
  53.         }
  54.     }
  55. }

  56. int main(int argc, char* argv[])
  57. {
  58.     int i;
  59.     test();
  60.     for(i=MIN_EXP;i<=MAX_EXP;i++){
  61.         printf("c[%d]=%d\n",i,cc[i]);
  62.     }
  63.     return 0;
  64. }
复制代码

eMathBBS_1125.zip

22.69 KB, 下载次数: 5, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

编译好的无任何限制的程序,可以任意指定幂次范围。

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-25 07:53 , Processed in 0.066134 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表