问题是:
13195的主要因素是5,7,13和29。
600851475143号码的最大主要因素是什么?
这是我在C ++中的尝试
#include <bits/stdc++.h>
using namespace std;
void ProblemThree(long long int n) {
bool prime[n];
memset(prime, true, sizeof(prime));
for (int i = 2; i * i < n; i++) {
if (prime[i]) {
if (n % i == 0) {
printf("d", i);
for (int k = 2 * i; k <= n; k += i) {
prime[k] = false;
}
}
}
}
}
int main() {
ProblemThree(600851475143);
}
程序意外崩溃,编译器没有显示错误。为什么这样,我怎么能阻止它发生?
答案 0 :(得分:4)
它崩溃了,因为你试图分配的数组太大了。由于您只需要测试一个数字,因此无需存储中间结果,您可以继续计算数字的素数因子并获取最大因子。
您可以使用以下算法使用O(1)空间计算解决方案:
long long maxPrimeFactor(long long n)
{
long long maxPrimeFactor = 1;
while (n%2 == 0)
{
n = n/2;
maxPrimeFactor = 2;
}
// n must be odd at this point. So we can skip
// one element (Note i = i +2)
for (int i = 3; i <= sqrt(n); i = i+2)
{
while (n%i == 0)
{
maxPrimeFactor = max(maxPrimeFactor, i);
n = n/i;
}
}
if (n > 2){
maxPrimeFactor = max(maxPrimeFactor, n);
}
return maxPrimeFactor;
}
注意:代码未经过测试,但它应该提出想法并且仍然接近工作。