C++ 欧拉项目"3c"和"x2B ;+;程序崩溃
问题是: 13195的主要因子为5、7、13和29 数字600851475143中最大的素因子是什么 这是我在C语言中的尝试++C++ 欧拉项目"3c"和"x2B ;+;程序崩溃,c++,C++,问题是: 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+
#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);
}
#包括
使用名称空间std;
空洞问题三(长整型){
布尔素数[n];
memset(prime,true,sizeof(prime));
对于(int i=2;i*i 对于(int k=2*i;k它会崩溃,因为您尝试分配的数组太大。因为您有一个要测试的数字,所以不需要存储中间结果,您可以继续计算该数字的素因子分解,并取最大因子
可以使用以下算法计算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;
}
long-long maxPrimeFactor(长n)
{
长maxPrimeFactor=1;
而(n%2==0)
{
n=n/2;
maxPrimeFactor=2;
}
//n在这一点上一定是奇数,所以我们可以跳过
//一个元件(注i=i+2)
对于(int i=3;i 2){
maxPrimeFactor=max(maxPrimeFactor,n);
}
返回maxPrimeFactor;
}
注意:代码没有经过测试,但它应该给出了想法,并且仍然可以正常工作。它崩溃了,因为您尝试分配的数组太大。由于您只有一个数字要测试,因此不需要存储中间结果,您可以继续计算该数字的素因子分解,并取最大因子。
可以使用以下算法计算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;
}
long-long maxPrimeFactor(长n)
{
长maxPrimeFactor=1;
而(n%2==0)
{
n=n/2;
maxPrimeFactor=2;
}
//n在这一点上一定是奇数,所以我们可以跳过
//一个元件(注i=i+2)
对于(int i=3;i 2){
maxPrimeFactor=max(maxPrimeFactor,n);
}
返回maxPrimeFactor;
}
注意:代码未被测试,但它应该给出这个想法,并且仍然接近工作。
<代码>布尔Orth[n];< /C> >将是一个“可变长度数组”。VLAs不是标准C++特性。(尽管有些编译器不幸地接受它们作为扩展—使用gcc,将-Wvla-Werror
添加到编译器命令行以确保不会意外使用它们)如果你想在C++中使用一个动态数组,使用<代码> STD::vector > < /> >不是标准C++,而<代码>使用命名空间STD;——这只是一个非常坏的习惯。当我们在上面的时候,<代码> PrtTf(“D”,I);只是错误的。<代码>布尔Orth[n];< /Cord>将是一个“可变长度数组”。VLAs不是标准C++特性(尽管有些编译器不幸地将它们作为GCC扩展),将“<代码> -WVLA-WError < /C>”添加到编译器命令行中,以确保您不会意外地使用它们。如果你想在C++中使用一个动态数组,使用<代码> STD::vector < /> >包含< /COD>不是标准C++,而<代码>使用命名空间STD;——虽然合法,但只是一个非常坏的习惯。
完全是错误的。听起来很可能。你不需要一个大小为n的数组。正如循环条件所建议的,你最多需要一个大小为sqrt(n)的数组。但你也不需要存储所有数组。@JamesFaix确实,这可以在O(1)中解决空间复杂度。听起来很有可能。你不需要大小为n的数组。正如循环条件所建议的,你最多需要一个大小为sqrt(n)的数组。但你也不需要存储所有数组。@JamesFaix确实,这可以在O(1)空间复杂度中解决。