前言:PE(Project Eluer)是学Mathematica(以后我简称Mma)接触到的,不用提交代码,只用提交答案的答题网站。PE的题目会给出C++和Mma代码实现,以此学习Mma(已经被它的简洁给折服了..)。
题目
The prime factors of 13195 are 5, 7, 13 and 29.What is the largest prime factor of the number 600851475143 ?
https://projecteuler.net/problem=3
分析
题目求由数的因式分解,求因式中最大值。
看到prime,就往素数方面去想了,思路是,把N用一个素数p去除,缩小N,p等于下一个素数,循环,直到N缩小到1为止。
Code
#include<iostream>
using namespace std;
int nextPrime(int n);
bool isPrime(int n);
int MaxFct(__int64 n);
int main(){
__int64 n = 600851475143;
cout << MaxFct(n);
return 0;
}
int MaxFct(__int64 n){
int i = 0;
int maxFct = 1;
while (n>1)
{
i = nextPrime(i);
if (n%i == 0){
n /= i;
maxFct = i > maxFct ? i : maxFct;
}
}
return maxFct;
}
int nextPrime(int n)
{
n++;
while (!isPrime(n))
n++;
return n;
}
bool isPrime(int n){
int a = sqrt(n);
bool isP = true;
if (n < 2){
return false;
}
int t;
for (int i = 2; i <= a; i++)
{
t = (n % i);
if ((n % i) == 0){
isP = false;
break;
}
}
return isP;
}
Mathematica
FactorInteger[600851475143] // Flatten // Max