找回密码
 欢迎注册
楼主: 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-11-21 20:55 , Processed in 0.035159 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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