| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2395 人关注过本帖
标题:projecteuler.net 系列问题转贴
只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用beyondyf在2011-6-26 22:11:55的发言:

有趣的题。第一题第二题很简单,下面给出算法。第三题大数的因式分解,我也没有很好的算法,和大家属于一个数量级。
正在看非诚勿扰,呵呵如果大家感兴趣,一会儿解释算法。
#include<stdio.h>
#include<math.h>

#define SQRT_5    2.2360679774997896964091736687313
#define A        ((1 + SQRT_5) / 2)
#define B        ((1 - SQRT_5) / 2)


int Test1(int n) //计算1-N以内(包括N)能被3和5整除的整数的和
{
    int i, a3, a5, a15;
    //n--;//如果不包括N请取消这行的注释
    i = n / 3;
    a3 = (3 * (i + 1) * i) >> 1;
    i = n / 5;
    a5 = (5 * (i + 1) * i) >> 1;
    i = n / 15;
    a15 = (15 * (i + 1) * i) >> 1;
    return a3 + a5 - a15;
}

int Test2(int a) //计算小于等于a的fibonacci数列中的值为偶数的项的和
{
    double x, y, sf;
    int n, t;
   
    x = log(SQRT_5 * a) / log(A);
    x += 0.5;
    n = (int)x;
    y = (pow(A, n) - pow(B, n)) / SQRT_5;
    y += 0.5;
    t = (int)y;
    if(t > a) n--;
    sf = ((SQRT_5 + 1) / (SQRT_5 - 1) * (pow(A, n) - 1) - (1 - SQRT_5) / (1 + SQRT_5) * (1 - pow(B, n))) / SQRT_5;
    sf += 0.5;
   
    return ((int)sf) / 2;
}

int main()
{
    printf("%d\n", Test1(1000));
    printf("%d\n", Test2(4000000));
    return 0;
}


能证明你的 performance 比我的好吗?
2011-06-26 23:22
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 21楼 Devil_W
performance ?不明白你指的哪一个的性能。
第一题只是求三个等差数列。你我的算法复杂度都是O(1)。
第二题你的算法时间复杂度是O(n),n是fibonacci数列的代求项数。而我的,看看代码就知道了,没一个循环,时间复杂度是O(1)。其中用了pow 和 log 两个库函数,用于计算指数和对数值。这两个函数用的应该是迭代法,其复杂度与参数的大小无关,只与要求的精度有关,而我们的精度有double,是固定的,所以这两个函数的时间复杂度是O(1)。
关于第二题,你的算法仍然是寻找所有的满足条件的项,求和。我用的是代数方法,寻找相应的公式。做这个题我用了两个多小时,时间主要花在寻找公式及公式正确性的证明上了。编码很简单,你也看到了。请放心,代码使用的公式绝对原创,我没有抄别人东西的习惯。

对第二题算法的解释其实就是对公式建立过程的解释和公式成立的证明过程。我在推演过程中用了4张A4纸。所以这个算法不是一两句话能说清楚的。今天太晚了,就不解释了。另外,在这个论坛关于算法的代码我也写过不少了,不过回应的人不多。如果大家对我的算法不感兴趣,那我也没有解释的必要了。
如果还有人想知道,请告诉我一声,我会很高兴与你分享的

重剑无锋,大巧不工
2011-06-26 23:51
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
没那么玄乎,就一个推到公式 ,几行就可以搞定了.

F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}【√5表示根号5】
2011-06-27 00:04
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
不错,那是数列的通项公式,推演也确实是建立在它的基础上的。然后呢?

重剑无锋,大巧不工
2011-06-27 00:10
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用beyondyf在2011-6-27 00:10:31的发言:

不错,那是数列的通项公式,推演也确实是建立在它的基础上的。然后呢?


一时还真没看出来。但是我check了performance,时间上两种方法的优劣在这个数据规模上真体现不出谁更优。

而且,我不确定你的推到是不是正确的。
2011-06-27 11:43
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
4000000,大概也就在前30项以内。不管用什么方法做现在的电脑都可以在1MS内完成。所以我们俩的算法只能在理论上做比较。
我的两个小时就是在证明它的正确性。很高兴你能和你在算法层面上探讨这个问题。
如果你有兴趣在更大空间内试试咱俩的算法,那我们可以试试高精度大数运算。这种情况下我就没有现成的pow和log可用了,但也不是什么很大的问题,上学时我就写过这两个函数的高精度算法。
有兴趣吗?

重剑无锋,大巧不工
2011-06-27 11:58
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用beyondyf在2011-6-27 11:58:56的发言:

4000000,大概也就在前30项以内。不管用什么方法做现在的电脑都可以在1MS内完成。所以我们俩的算法只能在理论上做比较。
我的两个小时就是在证明它的正确性。很高兴你能和你在算法层面上探讨这个问题。
如果你有兴趣在更大空间内试试咱俩的算法,那我们可以试试高精度大数运算。这种情况下我就没有现成的pow和log可用了,但也不是什么很大的问题,上学时我就写过这两个函数的高精度算法。
有兴趣吗?


那就算index=2^20的偶数fib和好了。
2011-06-27 12:09
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
还能show下你的推导过程?
2011-06-27 12:43
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
已知了项的索引求和就降低难度了。事实上这道题的难度并不在求和,而在已知一项的大小,求这一项的索引。我的算法完成的是这一个工作。
至于求和,我可以告诉大家,Fibonacci数列每三项出现一个偶数。假设第 M 项是偶数,那么前 M 项中偶数的和正好是前 M 项和的一半。至于楼主说的偶数项值呈现黄金分割比也是正确的,Fibonacci数列里到处都是0.618,这倒是没什么稀奇的。
解释算法没有问题,写个更高精度的也没有问题,我也很乐意。只是不知道有多少人这感兴趣,值不值得我花时间去做?
这个帖子自我发言后也只有楼上的仁兄回应了我,无论是质疑还是别的,至少这是一种交流,互动。别人是否看懂了我的算法,不得而知。
这样吧,谁能证明上面说的三个结论包括那个黄金分割比,那说明大家对这个问题有兴趣,并愿意用心分析。那么我们可以继续解释这一题我的算法及进一步深入探讨。
如果没有人证明,那说明两个问题。一、没有足够的知识来理解这道题;二、不屑于做这道题。无论是什么,那这将是我关于这一问题的最后一贴。
最后,对楼主说,这三个题还是很有趣的。

重剑无锋,大巧不工
2011-06-27 13:26
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用beyondyf在2011-6-27 13:26:55的发言:

已知了项的索引求和就降低难度了。事实上这道题的难度并不在求和,而在已知一项的大小,求这一项的索引。我的算法完成的是这一个工作。
至于求和,我可以告诉大家,Fibonacci数列每三项出现一个偶数。假设第 M 项是偶数,那么前 M 项中偶数的和正好是前 M 项和的一半。至于楼主说的偶数项值呈现黄金分割比也是正确的,Fibonacci数列里到处都是0.618,这倒是没什么稀奇的。
解释算法没有问题,写个更高精度的也没有问题,我也很乐意。只是不知道有多少人这感兴趣,值不值得我花时间去做?
这个帖子自我发言后也只有楼上的仁兄回应了我,无论是质疑还是别的,至少这是一种交流,互动。别人是否看懂了我的算法,不得而知。
这样吧,谁能证明上面说的三个结论包括那个黄金分割比,那说明大家对这个问题有兴趣,并愿意用心分析。那么我们可以继续解释这一题我的算法及进一步深入探讨。
如果没有人证明,那说明两个问题。一、没有足够的知识来理解这道题;二、不屑于做这道题。无论是什么,那这将是我关于这一问题的最后一贴。
最后,对楼主说,这三个题还是很有趣的。


就这么完贴了?

我就是想看看你的推导过程。
2011-06-27 13:29
快速回复:projecteuler.net 系列问题转贴
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012877 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved