24小时热门版块排行榜    

CyRhmU.jpeg
查看: 3629  |  回复: 18
本帖产生 7 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

holmescn

金虫 (正式写手)

[交流] Euler 工程 第三题:寻找600851475143的最大质因子已有7人参与

昨天没有放出第三题,今天赶早补上。
前两个题目都比较简单了,只要会基本的数学和编程语言,就可以完成。
第三题就有点意思了。

第三题:寻找一个合数的最大质因数

对一个数(非质数)进行因数分解,比如13195=5x7x13x29。最大的质因数是29.
那么 600851475143 怎么分解呢?最大的质因数又是多少?

[ Last edited by holmescn on 2011-5-12 at 15:06 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★ ★
余泽成(金币+3, 程序强帖+1): 鼓励交流! 2011-05-12 19:10:07
为了说明微尘版主的观点不对,以及我也不知道我自己的想法对不对,我写了一个C++版的计算。之所以用了N久不用的C++,是因为我不想自己实现一个list,哈哈。不过,好像并没有比matlab快多少。

虽然600851475143不能用一个32位的int表示,但显然它的位数少于15,就可以用一个double来保存啊。当然,查卷的算法就要换用适合double的了。
CODE:
#include
#include
#include

using namespace std;

int main(int argc, char** argv){

    double n = 600851475143.0;
    list primes;

    for(int i = 2; i < sqrt(n); i++)
        primes.push_back(i);

    while(n > 1.0){
        double prime = primes.front();
        if(fmod(n, prime) == 0){
            cout<             n /= prime;
        }

        list::iterator it;
        primes.erase(primes.begin());

        for(it = primes.begin(); it != primes.end(); it++){
            if(fmod(*it, prime) == 0)
                it = primes.erase(it);
        }
    }
}

[ Last edited by holmescn on 2011-5-12 at 15:10 ]
11楼2011-05-12 11:13:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 19 个回答

微尘、梦想

木虫 (知名作家)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
xzhdty(金币+1): 谢谢微尘、梦想 斑斑 2011-05-10 15:10:46
余泽成(程序强帖+1): 2011-05-12 19:07:28
CODE:
#include "stdio.h"
void main(void)
{
    int i,a;
    printf("请输入一个整数:" );
    scanf("%d",&a);

    for(i=2;a!=1;i++)
        if(a%i==0)
        {
            a/=i;
            printf("%d\t",i);
            i--;
        }
        printf("\n" );
}

由于32位内存的限制,无法求出太大的数!

[ Last edited by 微尘、梦想 on 2011-5-12 at 16:19 ]
任风云变幻,我笑对人生!
2楼2011-05-10 13:19:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
xzhdty(金币+2): 呵呵谢谢应助 2011-05-10 15:11:23
余泽成(程序强帖+1): 2011-05-12 19:07:37
此题很变态,matlab运行55s,
CODE:
function result = euler3()
tic;
result = 0;
n = 600851475143;
for i=3:sqrt(n)
    if isprime(i)==1 && mod(n,i)==0
        result = i;
    end
end
toc;
end

答案
CODE:
Elapsed time is 55.277722 seconds.
ans =
        6857

[ Last edited by libralibra on 2011-5-10 at 16:46 ]
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2011-05-10 13:58:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★
余泽成(金币+2): 辛苦了! 2011-05-11 23:01:56
其实有个作弊的解法哈哈,用Mathematica直接

FactorInteger[600851475143]

当然3楼的结果是对的。
不过,好像因为是线性查找,效率才不高。还有,干什么不从大到小找呢?那样快很快的。
4楼2011-05-10 14:40:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复(可上传附件)
信息提示
请填处理意见