Project Euler Problem 3 (C++和Python代码实现和解析)

100 篇文章 3 订阅
87 篇文章 1 订阅

Problem 3 : Largest prime factor

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

1. 第3个问题:最长(大)的质因数

13195的质因数有5,7,13和29。

600851475143的最长(大)的质因数是什么?

2. 求解分析

这道题主要涉及到两个知识点:一个是质数或者素数,另一个是因数或者因子。考虑到数600851475143还是在long long可以表示的的范围之内,所以数据结构不用特别考虑。

我们需要一个函数判断一个正整数是否为质数,另外我们需要一个函数来分解一个整数的所有因数,然后判断出最大的质因数。

3. C++ 代码实现

我们定义了一个类,包含两个函数:checkPrime()和findLargestPrimeFactor()。

checkPrime用来判断一个数是否为质数,如果是质数,返回值为true,否则,返回值为false。

函数findLargestPrimeFactor()用来找到number的因数,如果因数是质数的话,则保存最大的质因数,返回值为最大的质因数。

C++ 代码

#include <iostream>
#include <cmath>      // sqrtl()
#include <cassert>    // assert()

using namespace std;

class PE0003
{
private:
    bool checkPrime(long long number);

public:
    long long findLargestPrimeFactor(long long number);
};

bool PE0003::checkPrime(long long number)
{
    if (number < 2 || number > 2 && 0 == number % 2)
    {
        return false;
    }

    long double squareRoot = sqrtl((long double)number);
    for(long long i=3;i<=(long long)squareRoot;i+=2)  // 3, 5, 7, ...
    {
        if (number % i == 0)
        {
            return false;
        }
    }

    return true;
}

long long PE0003::findLargestPrimeFactor(long long number)
{    
    long long largestPrimeFactor = 2;
    long double squareRoot=sqrtl((long double)number);

    for(long int n=3; n<=(long long)squareRoot; n+=2)  // i = 3, 5, 7, 9, ... 
    {
        if (number % n == 0)  // n is factor of number 
        {
            if (true == checkPrime(n))
            {
                if (largestPrimeFactor < n)
                {
                    largestPrimeFactor = n;
                }
            }
            if (n*n!= number && true == checkPrime(number/n))
            {
                if (largestPrimeFactor < number/n)
                {
                    largestPrimeFactor = number/n;
                }
            }
        }
    }

    return largestPrimeFactor;
}
   
int main()
{
    PE0003 pe0003;

    long long int largestPrimeFactor = pe0003.findLargestPrimeFactor(13195);
    assert(29 == largestPrimeFactor);

    long long number = 600851475143;
    largestPrimeFactor = pe0003.findLargestPrimeFactor(number);

    cout << "The largest prime factor of the number " << number;
    cout << " is " << largestPrimeFactor << "." << endl;

    return 0;
}

4. Python 代码实现

Python采用了和C++类似的方法,我们也定义了两个函数:checkPrime()和getLargestPrimeFactor()。

Python 代码

import math

def checkPrime(x):
    if (x < 2) or (x != 2 and x%2 == 0):
        return False
  
    for i in range (3, int(math.sqrt(x))+1, 2):
        if 0 == x % i:
            return False
    
    return True
    
def getLargestPrimeFactor(n):
    largestPrimeFactor = 2
    for x in range(3, int(math.sqrt(n))+1, 2):
        if n % x == 0:
            if True == checkPrime(x):
                if largestPrimeFactor < x:
                    largestPrimeFactor = x
            if x*x != n and True == checkPrime(n//x):
                if largestPrimeFactor < n//x:
                    largestPrimeFactor = n//x
    return largestPrimeFactor
    
def main():
    assert 29 == getLargestPrimeFactor(13195)
    print("The largest prime factor of the number 600851475143 is", 
          getLargestPrimeFactor(600851475143))

if  __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值