24小时热门版块排行榜    

查看: 3788  |  回复: 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的回帖

liandaoacc

新虫 (初入文坛)


小木虫: 金币+0.5, 给个红包,谢谢回帖
这是我写的,只验证了一些数,结果是对的,对于600851475143也是对的,但是没有经过仔细验证,所以不敢保证绝对对的。
#include <stdlib.h>
#include <map>
#include <iostream>
bool isPrime2(long n)
{
        if(n < 2)
                return false;
        if(n == 2)
                return true;
        if(n % 2 == 0)
                return false;
        for(long i = 3; i < n; i += 2)
        {
                if(n % i == 0)
                        return false;
        }
        return true;
}
void primeFactorDecomp(long long number, std::map<long, int> &primefactors)
{
        int size = primefactors.size();
        long beginprime = 2;
        long long numbercpy = number;
        int count = 0;
        if(size != 0)
        {
                std::map<long, int>::reverse_iterator rit = primefactors.rbegin();
                beginprime = rit->first;
                if(beginprime == 2)
                        beginprime += 1;
                else
                        beginprime += 2;
        }
        while(!isPrime2(beginprime))
        {
                beginprime += 2;
                if(beginprime > numbercpy)
                        return;
        }
        while(! (numbercpy % beginprime))
        {
                numbercpy /= beginprime;
                count++;
        }
        primefactors.insert(std::pair<long, int>(beginprime, count));
        primeFactorDecomp(numbercpy, primefactors);
}

int main(int argc, char** argv)
{
        long long number = 600851475143;
        std::map<long, int> primefactors;
        primeFactorDecomp(number, primefactors);
        std::map<long, int>::reverse_iterator rit = primefactors.rbegin();
        std::cout << rit ->first <<  '\n';
        return 0;
}
18楼2013-11-17 22:12:16
已阅   回复此楼   关注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的回帖
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见