gxqcn 发表于 2010-11-17 16:49:27

在我的电脑上,gxq 56楼的程序和我这个程序性能相当,只需7秒就得到结果。gxq,能否在你的电脑上测试一下我的这个程序?
liangbch 发表于 2010-11-17 15:03 http://bbs.emath.ac.cn/images/common/back.gif

你的要快多了!

我的56#结果:n = 1        Wed Nov 17 16:46:05 2010
s0 = 2.717857142857143
s9 = 0.111111111111111
s0/s9 = 24.460714285714285
s0+s9 = 2.828968253968254

n = 2        Wed Nov 17 16:46:05 2010
s0 = 2.053991622224917
s9 = 0.294417641446448
s0/s9 = 6.976455663912790
s0+s9 = 2.348409263671365

n = 3        Wed Nov 17 16:46:05 2010
s0 = 1.817871425200977
s9 = 0.489221917709748
s0/s9 = 3.715842155460231
s0+s9 = 2.307093342910725

n = 4        Wed Nov 17 16:46:05 2010
s0 = 1.633364212583175
s9 = 0.669670962910865
s0/s9 = 2.439054853869453
s0+s9 = 2.303035175494040

n = 5        Wed Nov 17 16:46:05 2010
s0 = 1.469783389239973
s9 = 0.832846704579078
s0/s9 = 1.764770612837813
s0+s9 = 2.302630093819051

n = 6        Wed Nov 17 16:46:05 2010
s0 = 1.322783057766752
s9 = 0.979806535235522
s0/s9 = 1.350045146870536
s0+s9 = 2.302589593002275

n = 7        Wed Nov 17 16:46:06 2010
s0 = 1.190502772693381
s9 = 1.112082770300745
s0/s9 = 1.070516336091988
s0+s9 = 2.302585542994125

n = 8        Wed Nov 17 16:46:07 2010
s0 = 1.071452317287522
s9 = 1.231132820706344
s0/s9 = 0.870297907152530
s0+s9 = 2.302585137993867

n = 9        Wed Nov 17 16:46:27 2010
s0 = 0.964307069526290
s9 = 1.338278027967131
s0/s9 = 0.720558097326824
s0+s9 = 2.302585097493420

你的79#结果:n = 1        Wed Nov 17 16:46:46 2010
s0 = 2.717857142857143
s9 = 0.111111111111111
s0/s9 = 24.460714285714285


n = 2        Wed Nov 17 16:46:46 2010
s0 = 2.053991622224917
s9 = 0.294417641446448
s0/s9 = 6.976455663912790


n = 3        Wed Nov 17 16:46:46 2010
s0 = 1.817871425200977
s9 = 0.489221917709748
s0/s9 = 3.715842155460231


n = 4        Wed Nov 17 16:46:46 2010
s0 = 1.633364212583175
s9 = 0.669670962910865
s0/s9 = 2.439054853869453


n = 5        Wed Nov 17 16:46:46 2010
s0 = 1.469783389239973
s9 = 0.832846704579078
s0/s9 = 1.764770612837813


n = 6        Wed Nov 17 16:46:46 2010
s0 = 1.322783057766752
s9 = 0.979806535235522
s0/s9 = 1.350045146870536


n = 7        Wed Nov 17 16:46:46 2010
s0 = 1.190502772693381
s9 = 1.112082770300745
s0/s9 = 1.070516336091988


n = 8        Wed Nov 17 16:46:47 2010
s0 = 1.071452317287522
s9 = 1.231132820706344
s0/s9 = 0.870297907152530


n = 9        Wed Nov 17 16:46:55 2010
s0 = 0.964307069526290
s9 = 1.338278027967131
s0/s9 = 0.720558097326824

gxqcn 发表于 2010-11-17 16:54:23

看来是 liangbch 的预处理起了很大作用。

liangbch 发表于 2010-11-17 18:12:05

60# 无心人
我的方法不新鲜,无心人在60#就提到这个想法,只不过我成功的实现了而已。

chyanog 发表于 2010-11-17 21:27:36

根据我的测试,liangbch 和gxqcn两位大牛的代码效率高低不好比较啊。
我用的VC10(装VS2010还不到一个月),在默认Debug的情况下,前者11s,后者22s
,用Release+“使速度最大化”选项编译,多次比较竟然速度一致,均是11s!
不过,用gcc编译,gxqcn的代码+优化选项却不起作用。。。
在Linux上暂未测试

gxqcn 发表于 2010-11-18 07:42:28

我的代码已经相当底层了,所以编译器优化不大起作用。:)

chyanog 发表于 2010-11-29 00:31:38

又实现了一种方法,以前想到过,但没写出来。代码比较丑,效率还算不错,在我的笔记本上运行14s。应该是我目前写的行数最多的程序了,感觉肯定能写精简些,但我还简化不了,哪位大牛有空了帮我看看,给点建议。

#include <stdio.h>
#include <time.h>
#include <math.h>

void disp(double s0,double s9)
{
        printf( "s0 = %.15f\ns9 = %.15f\ns0/s9 = %.15f\n\n\n", s0, s9, s0/s9);
}

double calcS(int n)
{
        double s=0.0;
        int i,k;
        k=(int)pow(10.0,n-1);       
        for(i=k;i<10*k;i++)
                s+=1.0/i;
        return s;          
}
//------------------------------
void search_1()
{
        double s9,s0;
        s9=s0=0.0;
        int a;
        for (a=1;a<=8;a++)   
                s0+=1.0/a;
        s9=calcS(1)-s0;
        disp(s0,s9);
}

void search_2()
{
        double s9,s0;
        s9=s0=0.0;
        int a,b;
        for (a=1;a<=8;a++)
                for (b=0;b<=8;b++)      
                        s0+=1.0/(10*a+b);
        s9=calcS(2)-s0;
        disp(s0,s9);
}

void search_3()
{
        double s9,s0,s;
        s9=s0=0.0;
        int a,b,c;
        for (a=1;a<=8;a++)
                for (b=0;b<=8;b++)
                        for (c=0;c<=8;c++)
                                s0+=1.0/(100*a+10*b+c);
        s9=calcS(3)-s0;
        disp(s0,s9);
}
void search_4()
{
        double s9,s0,s;
        s9=s0=0.0;
        int a,b,c,d;
        for (a=1;a<=8;a++)
                for (b=0;b<=8;b++)
                        for (c=0;c<=8;c++)
                                for (d=0;d<=8;d++)
                                        s0+=1.0/(1000*a+100*b+10*c+d);

        s9=calcS(4)-s0;
        disp(s0,s9);
}

void search_5()
{
        double s9,s0,s;
        s9=s0=0.0;
        int a,b,c,d,e;
        for (a=1;a<=8;a++)
                for (b=0;b<=8;b++)
                        for (c=0;c<=8;c++)
                                for (d=0;d<=8;d++)
                                        for (e=0;e<=8;e++)
                                                s0+=1.0/(10000*a+1000*b+100*c+10*d+e);
        s9=calcS(5)-s0;
        disp(s0,s9);
}

void search_6()
{
        double s9,s0,s;
        s9=s0=0.0;
        int a,b,c,d,e,f;
        for (a=1;a<=8;a++)
                for (b=0;b<=8;b++)
                        for (c=0;c<=8;c++)
                                for (d=0;d<=8;d++)
                                        for (e=0;e<=8;e++)
                                                for (f=0;f<=8;f++)
                                                        s0+=1.0/(100000*a+10000*b+1000*c+100*d+10*e+f);

        s9=calcS(6)-s0;
        disp(s0,s9);
}

void search_7()
{
        double s9,s0,s;
        s9=s0=0.0;
        int a,b,c,d,e,f,g;
        for (a=1;a<=8;a++)
                for (b=0;b<=8;b++)
                        for (c=0;c<=8;c++)
                                for (d=0;d<=8;d++)
                                        for (e=0;e<=8;e++)
                                                for (f=0;f<=8;f++)
                                                        for(g=0;g<=8;g++)
                                                                s0+=1.0/(1000000*a+100000*b+10000*c+1000*d+100*e+10*f+g);

        s9=calcS(7)-s0;
        disp(s0,s9);
}

void search_8()
{
        double s9,s0,s;
        s9=s0=0.0;
        int a,b,c,d,e,f,g,h;
        for (a=1;a<=8;a++)
                for (b=0;b<=8;b++)
                        for (c=0;c<=8;c++)
                                for (d=0;d<=8;d++)
                                        for (e=0;e<=8;e++)
                                                for (f=0;f<=8;f++)
                                                        for(g=0;g<=8;g++)
                                                                for(h=0;h<=8;h++)
                                                                        s0+=1.0/(10000000*a+1000000*b+100000*c+10000*d+1000*e+100*f+10*g+h);

        s9=calcS(8)-s0;
        disp(s0,s9);
}

void search_9()
{
        double s9,s0,s;
        s9=s0=0.0;
        int a,b,c,d,e,f,g,h,i;
        for (a=1;a<=8;a++)
                for (b=0;b<=8;b++)
                        for (c=0;c<=8;c++)
                                for (d=0;d<=8;d++)
                                        for (e=0;e<=8;e++)
                                                for (f=0;f<=8;f++)
                                                        for(g=0;g<=8;g++)
                                                                for(h=0;h<=8;h++)
                                                                        for(i=0;i<=8;i++)
                                                                                s0+=1.0/(100000000*a+10000000*b+1000000*c+100000*d+10000*e+1000*f+100*g+10*h+i);

        s9=calcS(9)-s0;
        disp(s0,s9);
}

int main()
{
        double t0=clock();
        search_1();
        search_2();
        search_3();
        search_4();
        search_5();
        search_6();
        search_7();
        search_8();
        search_9();
        printf("Elapsed time: %f s\n",(clock()-t0)/CLOCKS_PER_SEC);
        return 0;
}

gxqcn 发表于 2010-11-29 09:05:33

86# chyanog


重新整理了一下,但测试起来,效率似乎没有明显的提升。#include <stdio.h>
#include <time.h>

void disp(double s0,double s9)
{
    printf( "s0 = %.15f\ns9 = %.15f\ns0/s9 = %.15f\n\n\n", s0, s9, s0/s9);
}

double calcS(int n)
{
    static int b, e=1;
    double s=0.0;
    int k;
    b=e, e*=10;
    for(k=b;k<e;k++)
      s+=1.0/k;
    return s;
}
//------------------------------
void search_1()
{
    double s9,s0=0.0;
    int k;
    for (k=1;k<=8;k++)
      s0+=1.0/k;
    s9=calcS(1)-s0;
    disp(s0,s9);
}

void search_2()
{
    double s9,s0=0.0;
    int a,b,k=10;
    for (b=1;b<=8;b++,k+=1)
      for (a=0;a<=8;a++,k++)
            s0+=1.0/k;
    s9=calcS(2)-s0;
    disp(s0,s9);
}

void search_3()
{
    double s9,s0=0.0;
    int a,b,c,k=100;
    for (c=1;c<=8;c++,k+=10)
      for (b=0;b<=8;b++,k+=1)
            for (a=0;a<=8;a++,k++)
                s0+=1.0/k;
    s9=calcS(3)-s0;
    disp(s0,s9);
}

void search_4()
{
    double s9,s0=0.0;
    int a,b,c,d,k=1000;
    for (d=1;d<=8;d++,k+=100)
      for (c=0;c<=8;c++,k+=10)
            for (b=0;b<=8;b++,k+=1)
                for (a=0;a<=8;a++,k++)
                  s0+=1.0/k;
    s9=calcS(4)-s0;
    disp(s0,s9);
}

void search_5()
{
    double s9,s0=0.0;
    int a,b,c,d,e,k=10000;
    for (e=1;e<=8;e++,k+=1000)
      for (d=0;d<=8;d++,k+=100)
            for (c=0;c<=8;c++,k+=10)
                for (b=0;b<=8;b++,k+=1)
                  for (a=0;a<=8;a++,k++)
                        s0+=1.0/k;
    s9=calcS(5)-s0;
    disp(s0,s9);
}

void search_6()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,k=100000;
    for (f=1;f<=8;f++,k+=10000)
      for (e=0;e<=8;e++,k+=1000)
            for (d=0;d<=8;d++,k+=100)
                for (c=0;c<=8;c++,k+=10)
                  for (b=0;b<=8;b++,k+=1)
                        for (a=0;a<=8;a++,k++)
                            s0+=1.0/k;
    s9=calcS(6)-s0;
    disp(s0,s9);
}

void search_7()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,k=1000000;
    for (g=1;g<=8;g++,k+=100000)
      for (f=0;f<=8;f++,k+=10000)
            for (e=0;e<=8;e++,k+=1000)
                for (d=0;d<=8;d++,k+=100)
                  for (c=0;c<=8;c++,k+=10)
                        for (b=0;b<=8;b++,k+=1)
                            for (a=0;a<=8;a++,k++)
                              s0+=1.0/k;
    s9=calcS(7)-s0;
    disp(s0,s9);
}

void search_8()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,h,k=10000000;
    for (h=1;h<=8;h++,k+=1000000)
      for (g=0;g<=8;g++,k+=100000)
            for (f=0;f<=8;f++,k+=10000)
                for (e=0;e<=8;e++,k+=1000)
                  for (d=0;d<=8;d++,k+=100)
                        for (c=0;c<=8;c++,k+=10)
                            for (b=0;b<=8;b++,k+=1)
                              for (a=0;a<=8;a++,k++)
                                    s0+=1.0/k;
    s9=calcS(8)-s0;
    disp(s0,s9);
}

void search_9()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,h,i,k=100000000;
    for (i=1;i<=8;i++,k+=10000000)
      for (h=0;h<=8;h++,k+=1000000)
            for (g=0;g<=8;g++,k+=100000)
                for (f=0;f<=8;f++,k+=10000)
                  for (e=0;e<=8;e++,k+=1000)
                        for (d=0;d<=8;d++,k+=100)
                            for (c=0;c<=8;c++,k+=10)
                              for (b=0;b<=8;b++,k+=1)
                                    for (a=0;a<=8;a++,k++)
                                        s0+=1.0/k;
    s9=calcS(9)-s0;
    disp(s0,s9);
}

int main()
{
    double t0=clock();
    search_1();
    search_2();
    search_3();
    search_4();
    search_5();
    search_6();
    search_7();
    search_8();
    search_9();
    printf("Elapsed time: %f s\n",(clock()-t0)/CLOCKS_PER_SEC);
    return 0;
}

G-Spider 发表于 2010-11-29 20:02:22

本帖最后由 G-Spider 于 2010-11-30 00:15 编辑

整理了一下,瓶颈在n=9时,用时最多,效率没有提升,或许将calcS()通过筛选方式只算与9有关的可能会好一点,(calcS(9)再做减法,代价非常大,占整体时间的一半以上)。还有依赖性(比如:static不是好的开始),这个好消除。#include <stdio.h>
#include <time.h>

void disp(double s0,double s9,int n)
{
    printf( "s0[%d] = %.15f\ns9[%d] = %.15f\ns0/s9 = %.15f\n\n\n", n,s0,n,s9,s0/s9);
}

double calcS(int n)//n=1,2,3,...,9
{
    int e={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
    int k;
    double s=0.0;
    for(k=e;k<e;k++)
      s+=1.0/k;
    return s;
}

//------------------------------
double search_1()
{
    double s9,s0=0.0;
    int k;
    for (k=1;k<=8;k++)
      s0+=1.0/k;
    return s0;

}

double search_2()
{
    double s9,s0=0.0;
    int a,b,k=10;
    for (b=1;b<=8;b++,k+=1)
      for (a=0;a<=8;a++,k++)
            s0+=1.0/k;
    return s0;

}

double search_3()
{
    double s9,s0=0.0;
    int a,b,c,k=100;
    for (c=1;c<=8;c++,k+=10)
      for (b=0;b<=8;b++,k+=1)
            for (a=0;a<=8;a++,k++)
                s0+=1.0/k;
    return s0;

}

double search_4()
{
    double s9,s0=0.0;
    int a,b,c,d,k=1000;
    for (d=1;d<=8;d++,k+=100)
      for (c=0;c<=8;c++,k+=10)
            for (b=0;b<=8;b++,k+=1)
                for (a=0;a<=8;a++,k++)
                  s0+=1.0/k;
    return s0;

}

double search_5()
{
    double s9,s0=0.0;
    int a,b,c,d,e,k=10000;
    for (e=1;e<=8;e++,k+=1000)
      for (d=0;d<=8;d++,k+=100)
            for (c=0;c<=8;c++,k+=10)
                for (b=0;b<=8;b++,k+=1)
                  for (a=0;a<=8;a++,k++)
                        s0+=1.0/k;
    return s0;

}

double search_6()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,k=100000;
    for (f=1;f<=8;f++,k+=10000)
      for (e=0;e<=8;e++,k+=1000)
            for (d=0;d<=8;d++,k+=100)
                for (c=0;c<=8;c++,k+=10)
                  for (b=0;b<=8;b++,k+=1)
                        for (a=0;a<=8;a++,k++)
                            s0+=1.0/k;
    return s0;

}

double search_7()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,k=1000000;
    for (g=1;g<=8;g++,k+=100000)
      for (f=0;f<=8;f++,k+=10000)
            for (e=0;e<=8;e++,k+=1000)
                for (d=0;d<=8;d++,k+=100)
                  for (c=0;c<=8;c++,k+=10)
                        for (b=0;b<=8;b++,k+=1)
                            for (a=0;a<=8;a++,k++)
                              s0+=1.0/k;
   return s0;

}

double search_8()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,h,k=10000000;
    for (h=1;h<=8;h++,k+=1000000)
      for (g=0;g<=8;g++,k+=100000)
            for (f=0;f<=8;f++,k+=10000)
                for (e=0;e<=8;e++,k+=1000)
                  for (d=0;d<=8;d++,k+=100)
                        for (c=0;c<=8;c++,k+=10)
                            for (b=0;b<=8;b++,k+=1)
                              for (a=0;a<=8;a++,k++)
                                    s0+=1.0/k;
   return s0;

}

double search_9()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,h,i,k=100000000;
    for (i=1;i<=8;i++,k+=10000000)
      for (h=0;h<=8;h++,k+=1000000)
            for (g=0;g<=8;g++,k+=100000)
                for (f=0;f<=8;f++,k+=10000)
                  for (e=0;e<=8;e++,k+=1000)
                        for (d=0;d<=8;d++,k+=100)
                            for (c=0;c<=8;c++,k+=10)
                              for (b=0;b<=8;b++,k+=1)
                                    for (a=0;a<=8;a++,k++)
                                        s0+=1.0/k;
   return s0;

}
int main()
{
    doubles0={0};
    doubles9={0};
    doublet0=clock();

    s0=search_1();
    s0=search_2();
    s0=search_3();
    s0=search_4();
    s0=search_5();
    s0=search_6();
    s0=search_7();
    s0=search_8();
    s0=search_9();

            
    s9=calcS(1)-s0;
    disp(s0,s9,1);
    s9=calcS(2)-s0;
    disp(s0,s9,2);
    s9=calcS(3)-s0;
    disp(s0,s9,3);
    s9=calcS(4)-s0;
    disp(s0,s9,4);
    s9=calcS(5)-s0;
    disp(s0,s9,5);
    s9=calcS(6)-s0;
    disp(s0,s9,6);
    s9=calcS(7)-s0;
    disp(s0,s9,7);            
    s9=calcS(8)-s0;
    disp(s0,s9,8);
    s9=calcS(9)-s0;
    disp(s0,s9,9);
            
    printf("Elapsed time: %f s\n",(clock()-t0)/CLOCKS_PER_SEC);
    system("Pause");
    return 0;
}

G-Spider 发表于 2010-11-30 10:02:23

:)
考虑到一个现象,发现做减法有个好处,我们知道欧拉公式,lim(1+1/2+1/3+……+1/n) =In(n)+ C   
从n=8开始,可以满足本题的精度要求,所以有如下估计式
1/10000000+1/10000001+...+1/99999999=ln(99999999/9999999)   这个常数用系统自带的计算器就可以算出来
同理n=9以可以算出。
这样一来,时间缩短了1/3。以前上面的程序在我机子上要运行9.16s    ,现在只需要2.59s
(小数点前6位均准确,所以下面的结果只输出了前6位(这无效率影响,上面的9.16s也是只输出前6位的时间))#include <stdio.h>
#include <time.h>

void disp(double s0,double s9,int n)
{
    printf( "s0[%d] = %.6f\ns9[%d] = %.6f\ns0/s9 = %.6f\n\n\n", n,s0,n,s9,s0/s9);
}

double calcS(int n)//n=1,2,3,...,7
{
    int e={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
    int k;
    double s=0.0;
    for(k=e;k<e;k++)
      s+=1.0/k;
    return s;
}

//------------------------------
double search_1()
{
    double s9,s0=0.0;
    int k;
    for (k=1;k<=8;k++)
      s0+=1.0/k;
    return s0;

}

double search_2()
{
    double s9,s0=0.0;
    int a,b,k=10;
    for (b=1;b<=8;b++,k+=1)
      for (a=0;a<=8;a++,k++)
            s0+=1.0/k;
    return s0;

}

double search_3()
{
    double s9,s0=0.0;
    int a,b,c,k=100;
    for (c=1;c<=8;c++,k+=10)
      for (b=0;b<=8;b++,k+=1)
            for (a=0;a<=8;a++,k++)
                s0+=1.0/k;
    return s0;

}

double search_4()
{
    double s9,s0=0.0;
    int a,b,c,d,k=1000;
    for (d=1;d<=8;d++,k+=100)
      for (c=0;c<=8;c++,k+=10)
            for (b=0;b<=8;b++,k+=1)
                for (a=0;a<=8;a++,k++)
                  s0+=1.0/k;
    return s0;

}

double search_5()
{
    double s9,s0=0.0;
    int a,b,c,d,e,k=10000;
    for (e=1;e<=8;e++,k+=1000)
      for (d=0;d<=8;d++,k+=100)
            for (c=0;c<=8;c++,k+=10)
                for (b=0;b<=8;b++,k+=1)
                  for (a=0;a<=8;a++,k++)
                        s0+=1.0/k;
    return s0;

}

double search_6()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,k=100000;
    for (f=1;f<=8;f++,k+=10000)
      for (e=0;e<=8;e++,k+=1000)
            for (d=0;d<=8;d++,k+=100)
                for (c=0;c<=8;c++,k+=10)
                  for (b=0;b<=8;b++,k+=1)
                        for (a=0;a<=8;a++,k++)
                            s0+=1.0/k;
    return s0;

}

double search_7()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,k=1000000;
    for (g=1;g<=8;g++,k+=100000)
      for (f=0;f<=8;f++,k+=10000)
            for (e=0;e<=8;e++,k+=1000)
                for (d=0;d<=8;d++,k+=100)
                  for (c=0;c<=8;c++,k+=10)
                        for (b=0;b<=8;b++,k+=1)
                            for (a=0;a<=8;a++,k++)
                              s0+=1.0/k;
   return s0;

}

double search_8()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,h,k=10000000;
    for (h=1;h<=8;h++,k+=1000000)
      for (g=0;g<=8;g++,k+=100000)
            for (f=0;f<=8;f++,k+=10000)
                for (e=0;e<=8;e++,k+=1000)
                  for (d=0;d<=8;d++,k+=100)
                        for (c=0;c<=8;c++,k+=10)
                            for (b=0;b<=8;b++,k+=1)
                              for (a=0;a<=8;a++,k++)
                                    s0+=1.0/k;
   return s0;

}

double search_9()
{
    double s9,s0=0.0;
    int a,b,c,d,e,f,g,h,i,k=100000000;
    for (i=1;i<=8;i++,k+=10000000)
      for (h=0;h<=8;h++,k+=1000000)
            for (g=0;g<=8;g++,k+=100000)
                for (f=0;f<=8;f++,k+=10000)
                  for (e=0;e<=8;e++,k+=1000)
                        for (d=0;d<=8;d++,k+=100)
                            for (c=0;c<=8;c++,k+=10)
                              for (b=0;b<=8;b++,k+=1)
                                    for (a=0;a<=8;a++,k++)
                                        s0+=1.0/k;
   return s0;

}
int main()
{
    doubles0={0};
    doubles9={0};
    //由欧拉公式lim(1+1/2+...+1/n)=lnn+C(n->无穷,c为常数)
    //从第n=8开始,n值以达到其极限的精度要求
//完全可以用估计式ln( n/m )=1/n +1/(n-1)+...+1/(m+1)
    //这样明显减少计算时间
doubles_8=2.3025851829940506340183244547094;
    doubles_9=2.3025851019940457335179917876844;

    doublet0=clock();

    s0=search_1();
    s0=search_2();
    s0=search_3();
    s0=search_4();
    s0=search_5();
    s0=search_6();
    s0=search_7();
    s0=search_8();
    s0=search_9();

            
    s9=calcS(1)-s0;
    disp(s0,s9,1);
    s9=calcS(2)-s0;
    disp(s0,s9,2);
    s9=calcS(3)-s0;
    disp(s0,s9,3);
    s9=calcS(4)-s0;
    disp(s0,s9,4);
    s9=calcS(5)-s0;
    disp(s0,s9,5);
    s9=calcS(6)-s0;
    disp(s0,s9,6);
    s9=calcS(7)-s0;
    disp(s0,s9,7);            
    //==================   
    s9=s_8-s0;
    disp(s0,s9,8);
    s9=s_9-s0;   
    disp(s0,s9,9);
            
    printf("Elapsed time: %f s\n",(clock()-t0)/CLOCKS_PER_SEC);
    system("Pause");
    return 0;
}结果:
s0 = 2.717857
s9 = 0.111111
s0/s9 = 24.460714


s0 = 2.053992
s9 = 0.294418
s0/s9 = 6.976456


s0 = 1.817871
s9 = 0.489222
s0/s9 = 3.715842


s0 = 1.633364
s9 = 0.669671
s0/s9 = 2.439055


s0 = 1.469783
s9 = 0.832847
s0/s9 = 1.764771


s0 = 1.322783
s9 = 0.979807
s0/s9 = 1.350045


s0 = 1.190503
s9 = 1.112083
s0/s9 = 1.070516


s0 = 1.071452
s9 = 1.231133
s0/s9 = 0.870298


s0 = 0.964307
s9 = 1.338278
s0/s9 = 0.720558


Elapsed time: 2.599000 s
请按任意键继续. . .

gxqcn 发表于 2010-11-30 10:16:36

根据欧拉定理,所有的n位正整数的倒数和$=ln(10^n)-ln(10^(n-1))=ln10=2.3025850929940456840179914546844$
上述式子当n比较大时成立,也即 无心人 的 $s0+s9$
gxqcn 发表于 2010-5-19 14:59 http://bbs.emath.ac.cn/images/common/back.gif


楼上的与我在22#想的一致,所以的我程序特意输出了“s0+s9”
页: 1 2 3 4 5 6 7 8 [9] 10
查看完整版本: 当n=?时,含9的项之和开始大于不含9的项之和