原题
原题求的是600851475143的最大素数因子
600851475143
答案
6857
思路
数学背景
任何合数都可以被分为素数的乘积,例如12 = 3 * 4 = 3 * (2 * 2);
解题思路
那么我们只需要从小到大对被分解数求商即可将其分解为素数的乘积。(较大的合数因子一定会被较小的素数因子提前分解)然后我们就到一列递增素数列 或 { 数列,1 }。
例如:
255 = 3 * 5 * 17 -> { 3, 5, 17 };
100 = 2 * 2 * 5 * 5 * 1 -> { 2, 2, 5, 5, 1 };
若数列尾项为1,就取length - 1项;否则就取第length项。
代码实现
#include <iostream>
int main() {
const long long BigNum = 600851475143; // 保留原数据
long long N = BigNum; // 可更改项
long long i = 2; // 从2开始找素因子
while (i * i <= N) { // 最大因子不超过sqrt(N)(根号)
while (N % i == 0) { // 如果是因子将N分解
N /= i;
}
++i; // 迭代
}
--i; // 第length - 1 项
if (N == 1) { // 如果第length项为1就输出第length - 1项,即i
std::cout << i;
}
else { // 否则输出第length项,即N
std::cout << N;
}
return 0; // 运行成功,主程序返回0值
}
效率
#include <iostream>
#include <time.h>
int main() {
const long long BigNum = 600851475143;
long long N = BigNum;
long long i = 2;
clock_t beg, end;
// 这里开始
beg = clock();
while (i * i <= N) {
while (N % i == 0) {
N /= i;
}
++i;
}
--i;
if (N == 1) {
std::cout << i;
}
else {
std::cout << N;
}
end = clock();
// 这里截止
std::cout << '\n' << end - beg;
return 0;
}
使用clock()计时,在刨去分配内存的耗时下,程序大概花费0~1ms(毫秒)。