chyanog 发表于 2010-5-19 14:56:55

本帖最后由 chyanog 于 2010-5-19 15:12 编辑

我用Wayne的思路改写如下,效率提高了些,但仍不快。function :=
Total /@ (1.0/
GatherBy,
   MemberQ, 9] &])
function /@ Range // Timing
{63.344, {{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}}}

gxqcn 发表于 2010-5-19 14:59:49

根据欧拉定理,所有的n位正整数的倒数和=ln(10^n)-ln(10^(n-1))=ln10=2.3025850929940456840179914546844
上述式子当n比较大时成立,也即 无心人 的 s0+s9

gxqcn 发表于 2010-5-19 15:02:15

奇怪,无心人 的 $s0+s9$ 怎么都那么大?

原来,他计算的分母起始值是“1”,而非楼主要求 $10^(n-1)$,所以得重算一遍啊。。。

chyanog 发表于 2010-5-19 15:14:34

无心人 发表于 2010-5-19 15:32:17

:)

搞错了啊

chyanog 发表于 2010-5-19 15:33:54

include9 :=
Select, MemberQ, 9] &]
diff :=
Total] - (HarmonicNumber -HarmonicNumber)
diff /@ Range // Timing
Out= {5.75, {-2.60675, -1.75957, -1.32865, -0.963693, -0.636937, \
-0.342977}}

无心人 发表于 2010-5-19 15:43:48

program inv9;

{$APPTYPE CONSOLE}

uses
SysUtils, math;

function is9(n: integer): boolean;
begin
is9 := false;
while n > 0 do
begin
    if (n mod 10) = 9 then
    begin
      is9 := true;
      break;
    end;
    n := n div 10;
end;
end;

var
n, m: integer;
s0, s9: double;
d: array of integer;
i: integer;
begin
    d := 1;
    for I := 1 to 9 do
    begin
      d := d * 10;
      s0 := 0.0;
      s9 := 0.0;
      writeln('=============================');
      writeln('位数 = ', i);
      writeln(formatDateTime('当前时间: yy-mm-dd hh:nn:ss', now));
      n := d;
      while n <= d - 1 do
      begin
         if is9(n) then
         s9 := s9 + 1 / n
         else
         s0 := s0 + 1 / n;
         inc(n);
      end;

      writeln('s9 =', s9);
      writeln('s0 =', s0);
      writeln('s9 / s0 = ', s9 / s0);
      writeln(formatDateTime('当前时间: yy-mm-dd hh:nn:ss', now));
    end;
end.

修改了,下面是结果

无心人 发表于 2010-5-19 15:44:59

=============================
位数 = 1
当前时间: 10-05-19 15:42:39
s9 =   1.11111111111111E-0001
s0 =   2.71785714285714E+0000
s9 / s0 =4.08818805665061E-0002
当前时间: 10-05-19 15:42:39
=============================
位数 = 2
当前时间: 10-05-19 15:42:39
s9 =   2.94417641446448E-0001
s0 =   2.05399162222492E+0000
s9 / s0 =1.43339261105423E-0001
当前时间: 10-05-19 15:42:39
=============================
位数 = 3
当前时间: 10-05-19 15:42:39
s9 =   4.89221917709748E-0001
s0 =   1.81787142520098E+0000
s9 / s0 =2.69117997525959E-0001
当前时间: 10-05-19 15:42:39
=============================
位数 = 4
当前时间: 10-05-19 15:42:39
s9 =   6.69670962910865E-0001
s0 =   1.63336421258317E+0000
s9 / s0 =4.09994879128505E-0001
当前时间: 10-05-19 15:42:39
=============================
位数 = 5
当前时间: 10-05-19 15:42:39
s9 =   8.32846704579077E-0001
s0 =   1.46978338923997E+0000
s9 / s0 =5.66645881751150E-0001
当前时间: 10-05-19 15:42:39
=============================
位数 = 6
当前时间: 10-05-19 15:42:39
s9 =   9.79806535235522E-0001
s0 =   1.32278305776675E+0000
s9 / s0 =7.40715969623718E-0001
当前时间: 10-05-19 15:42:39
=============================
位数 = 7
当前时间: 10-05-19 15:42:39
s9 =   1.11208277030073E+0000
s0 =   1.19050277269338E+0000
s9 / s0 =9.34128668835241E-0001
当前时间: 10-05-19 15:42:39
=============================
位数 = 8
当前时间: 10-05-19 15:42:39
s9 =   1.23113282070628E+0000
s0 =   1.07145231728750E+0000
s9 / s0 =1.14903183356123E+0000
当前时间: 10-05-19 15:42:46
=============================
位数 = 9
当前时间: 10-05-19 15:42:46
s9 =   1.33827802796730E+0000
s0 =   9.64307069526340E-0001
s9 / s0 =1.38781314610153E+0000
当前时间: 10-05-19 15:43:57

无心人 发表于 2010-5-19 15:47:33

使用64位精度浮点(80位)的结果

=============================
位数 = 1
当前时间: 10-05-19 15:45:45
s9 =   1.11111111111111E-0001
s0 =   2.71785714285714E+0000
s9 / s0 =4.08818805665061E-0002
当前时间: 10-05-19 15:45:45
=============================
位数 = 2
当前时间: 10-05-19 15:45:45
s9 =   2.94417641446448E-0001
s0 =   2.05399162222492E+0000
s9 / s0 =1.43339261105423E-0001
当前时间: 10-05-19 15:45:45
=============================
位数 = 3
当前时间: 10-05-19 15:45:45
s9 =   4.89221917709748E-0001
s0 =   1.81787142520098E+0000
s9 / s0 =2.69117997525959E-0001
当前时间: 10-05-19 15:45:45
=============================
位数 = 4
当前时间: 10-05-19 15:45:45
s9 =   6.69670962910866E-0001
s0 =   1.63336421258317E+0000
s9 / s0 =4.09994879128506E-0001
当前时间: 10-05-19 15:45:45
=============================
位数 = 5
当前时间: 10-05-19 15:45:45
s9 =   8.32846704579074E-0001
s0 =   1.46978338923997E+0000
s9 / s0 =5.66645881751147E-0001
当前时间: 10-05-19 15:45:45
=============================
位数 = 6
当前时间: 10-05-19 15:45:45
s9 =   9.79806535235526E-0001
s0 =   1.32278305776677E+0000
s9 / s0 =7.40715969623709E-0001
当前时间: 10-05-19 15:45:45
=============================
位数 = 7
当前时间: 10-05-19 15:45:45
s9 =   1.11208277030072E+0000
s0 =   1.19050277269341E+0000
s9 / s0 =9.34128668835207E-0001
当前时间: 10-05-19 15:45:45
=============================
位数 = 8
当前时间: 10-05-19 15:45:45
s9 =   1.23113282070638E+0000
s0 =   1.07145231728766E+0000
s9 / s0 =1.14903183356115E+0000
当前时间: 10-05-19 15:45:52
=============================
位数 = 9
当前时间: 10-05-19 15:45:52
s9 =   1.33827802796742E+0000
s0 =   9.64307069526623E-0001
s9 / s0 =1.38781314610125E+0000
当前时间: 10-05-19 15:47:03

chyanog 发表于 2010-5-19 15:47:46

25# 无心人
没关系的,再接再厉啊,相信这题肯定会被完美解决的,这里可真是高手云集。
页: 1 2 [3] 4 5 6 7 8 9 10
查看完整版本: 当n=?时,含9的项之和开始大于不含9的项之和