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

[提问] 当n=?时,含9的项之和开始大于不含9的项之和

[复制链接]
发表于 2010-5-19 15:50:41 | 显示全部楼层
考虑64位精度结果,9位数字情况 两边数字<10^9个 精度 >= 10^9 / 2^64 = 5.42E-11,符合要求 同样道理,64位浮点情况 精度>= 10^9 / 2^53 = 1.11E-7 也满足要求
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-19 16:40:29 | 显示全部楼层
21# chyanog 这只是随手一写,关键是要找到一个好算法来分开含9的和不含9的数。 我这个方法很笨,要占用大量的存储空间,不过,速度还可以提高一倍多:
  1. f[x_] := Module[{n = x, tmp, t}, {tmp = Tuples[Range[0, 8], {n - 1}]; t = Sum[Total[1./Map[FromDigits, Prepend[#, ii] & /@ tmp]], {ii, 1,8}], HarmonicNumber[10^n - 1.] -HarmonicNumber[10^(n - 1) - 1.] - t}]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-19 16:51:45 | 显示全部楼层
29# 无心人 也就是说,已经得到楼主所需的结论:$n>=8$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-19 16:59:29 | 显示全部楼层
无心人拥有的计算能力是相当的强啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-5-19 17:42:47 | 显示全部楼层
33# gxqcn 嗯,应该没错,有劳大家了。 35.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-5-19 18:01:16 | 显示全部楼层
32# wayne 我试过了,用你的函数: f /@ Range[8] // Timing Out[1]:= {244.391, {{2.71786, 0.111111}, {2.05399, 0.294418}, {1.81787, 0.489222}, {1.63336, 0.669671}, {1.46978, 0.832847}, {1.32278, 0.979807}, {1.1905, 1.11208}, {1.07145, 1.23113}}} 效率确实高了不少,不知道还有没提高的余地,尽管比不上无心人Delphi的速度。你的Mathematica用的一直很帅啊。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-19 19:55:59 | 显示全部楼层
我觉得编码应尽量避免检验有没有“9”这个过程,因为这个检验过程不可避免地需要除法(包含求余)指令。 可采用构造法,比如利用:首位数字是1~8,其余位则可为0~8,这样直接可得到不含9的自然数,效率应该会大幅提高。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-20 09:04:33 | 显示全部楼层
我写的程序代码,无检测是否含9的过程:
  1. #include <stdio.h>
  2. #include <time.h>
  3. int main(int argc, char* argv[])
  4. {
  5. unsigned long i, j, v0, v9, d[9], m[9];
  6. double s0, s9;
  7. time_t sec;
  8. d[0] = 1;
  9. m[0] = 9;
  10. for ( i=1; i<9; ++i )
  11. {
  12. d[i] = d[i-1] * 10;
  13. m[i] = 9;
  14. }
  15. v9 = v0 = d[ i=0 ];
  16. for ( ; i<9; ++i )
  17. {
  18. s9 = s0 = 0.0;
  19. --m[i];
  20. do
  21. {
  22. s0 += 1.0 / v0;
  23. for ( ++v0, j=0; j<=i && 0==--m[j]; ++j )
  24. {
  25. v0 += d[j];
  26. m[j] = 9;
  27. }
  28. while ( v0 != ++v9 )
  29. {
  30. s9 += 1.0 / v9;
  31. }
  32. } while ( j <= i );
  33. time(&sec);
  34. printf( "n = %u\t%.24s\n", i+1, ctime(&sec) );
  35. printf( "s0 = %.15f\ns9 = %.15f\ns0/s9 = %.15f\ns0+s9 = %.15f\n\n", s0, s9, s0/s9, s0+s9 );
  36. }
  37. return 0;
  38. }
复制代码
注:该程序在 56# 再次得到优化。

评分

参与人数 1威望 +8 金币 +8 收起 理由
wayne + 8 + 8 不知道用boost C++会不会比你的快

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-20 09:05:49 | 显示全部楼层
运行结果如下:
  1. n = 1 Thu May 20 09:14:20 2010
  2. s0 = 2.717857142857143
  3. s9 = 0.111111111111111
  4. s0/s9 = 24.460714285714285
  5. s0+s9 = 2.828968253968254
  6. n = 2 Thu May 20 09:14:20 2010
  7. s0 = 2.053991622224917
  8. s9 = 0.294417641446448
  9. s0/s9 = 6.976455663912790
  10. s0+s9 = 2.348409263671365
  11. n = 3 Thu May 20 09:14:20 2010
  12. s0 = 1.817871425200977
  13. s9 = 0.489221917709748
  14. s0/s9 = 3.715842155460231
  15. s0+s9 = 2.307093342910725
  16. n = 4 Thu May 20 09:14:20 2010
  17. s0 = 1.633364212583175
  18. s9 = 0.669670962910865
  19. s0/s9 = 2.439054853869453
  20. s0+s9 = 2.303035175494040
  21. n = 5 Thu May 20 09:14:20 2010
  22. s0 = 1.469783389239973
  23. s9 = 0.832846704579078
  24. s0/s9 = 1.764770612837813
  25. s0+s9 = 2.302630093819051
  26. n = 6 Thu May 20 09:14:20 2010
  27. s0 = 1.322783057766752
  28. s9 = 0.979806535235522
  29. s0/s9 = 1.350045146870536
  30. s0+s9 = 2.302589593002275
  31. n = 7 Thu May 20 09:14:21 2010
  32. s0 = 1.190502772693381
  33. s9 = 1.112082770300745
  34. s0/s9 = 1.070516336091988
  35. s0+s9 = 2.302585542994125
  36. n = 8 Thu May 20 09:14:23 2010
  37. s0 = 1.071452317287522
  38. s9 = 1.231132820706344
  39. s0/s9 = 0.870297907152530
  40. s0+s9 = 2.302585137993867
  41. n = 9 Thu May 20 09:14:44 2010
  42. s0 = 0.964307069526290
  43. s9 = 1.338278027967131
  44. s0/s9 = 0.720558097326824
  45. s0+s9 = 2.302585097493420
  46. Press any key to continue
复制代码
总共才24秒即运行结束!非常高效!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-20 10:25:36 | 显示全部楼层
37# gxqcn 我在32楼用的 也是这个方法~~
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-23 23:33 , Processed in 0.025725 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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