算法设计之Project Euler 03:Largest prime factor

一、问题

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和本身整除的数。

如果对13195分解质因数,其结果为5,7,13,29.

那么对600851475143进行分解质因数,其最大的质数为多少?

答案为:6857

三、第一遍刷Project Euler

思路:需要定义两个函数,第一个函数用于判断一个数是否为质数,以便于后续调用这个函数来找寻质因数,另一个函数用于分解一个数的质因数,然后将质因数保存到list中,并输出最后一个质数,输出结果即为我们所求的结果。下面直接给出代码:

python版本代码:

import numpy

# 判断一个数是否为质数
def is_prime(x):
    for i in range(2, int(numpy.sqrt(x))+1):        # 求平方根可以用numpy.sqrt()
        if x % i == 0:
            return False
    return True

# 找出一个数的所有质数
def find_prime(y):
    all_prime = []                                  # 定义一个list,用于存储所有质数
    for j in range(2, (int(y**0.5)+1)):             # 求平方根可以用y**0.5
        if is_prime(j):
            if y % j == 0:
                y /= j
                all_prime.append(j)                 # 将找到的质数放入list中
    print(all_prime[-1])                            # 打印最后一个质数

if __name__ == '__main__':
    find_prime(600851475143)

C++版本代码需要用到vector,代码为:

#include<iostream>
#include<vector>

bool is_prime(int x)
{
	for (int i = 2; i < ceil(sqrt(x)); i++)
	{
		if (x%i==0)
		{
			return false;
		}
	}
	return true;
}

void main()
{
        //需要注意的是这里的类型必须写成long long int
	long long int input = 600851475143;

	std::vector<int> all_prime;
	for (int i = 2; i < ceil(sqrt(input)); i++)
	{
		if (is_prime(i))
		{
			if (input%i==0)
			{
				all_prime.push_back(i);
			}
		}
	}
	std::cout << all_prime.back() << std::endl;
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/z704630835/article/details/82658993