Eratosthenes 筛法的问题
Issues with Sieve of Eratosthenes
我选择了 "Programming Principles and Practice using C++",并且正在做一个涉及埃拉托色尼筛法的早期问题,我得到了意想不到的输出,但我无法确定问题到底是什么。这是我的代码:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> prime;
std::vector<int> nonPrime;
int multiple = 0;
for(int i = 2; i < 101; i++) //initialized to first prime number, i will
// be the variable that should contain prime numbers
{
for(int j = 0; j < nonPrime.size(); j++) //checks i against
// vector to see if
// marked as nonPrime
{
if(i == nonPrime[j])
{
goto outer;//jumps to next iteration if number
// is on the list
}
}
prime.push_back(i); //adds value of i to Prime vector if it
//passes test
for(int j = i; multiple < 101; j++) //This loop is where the
// sieve bit comes in
{
multiple = i * j;
nonPrime.push_back(multiple);
}
outer:
;
}
for(int i = 0; i < prime.size(); i++)
{
std::cout << prime[i] << std::endl;
}
return 0;
}
这个问题目前只要求我使用这种方法找到 100 以内的素数。我还尝试使用当前的 'goto' 方法在某些条件下跳出双循环,并且我还尝试在检查循环之后立即使用带有 if 语句的布尔标志并仅使用 "continue;" 语句并且都没有任何效果。
(老实说,我想既然人们说 goto 是邪恶的,也许它会产生我没有预见到的后果,这就是我试图将其关闭的原因)但问题并不要求我使用模块化函数,所以我假设它希望我在 main 中解决所有问题,因此我在 main 中使用嵌套循环的问题。哦,为了进一步说明我的输出问题,它似乎只将 2 的倍数添加到 nonPrime 向量,但其他所有内容都通过测试(例如 9)。
谁能帮我弄清楚哪里出错了?
鉴于这不是实现埃拉托色尼筛法的好方法,我将指出对您的代码的一些更改,以使其至少输出正确的序列。
另请注意,在第一个内循环之后,您选择的缩进有点误导。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> prime;
std::vector<int> nonPrime;
int multiple = 0;
for(int i = 2; i < 101; i++)
{
// you can use a flag, but note that usually it could be more
// efficiently implemented with a vector of bools. Try it yourself
bool is_prime = true;
for(int j = 0; j < nonPrime.size(); j++)
{
if(i == nonPrime[j])
{
is_prime = false;
break;
}
}
if ( is_prime )
{
prime.push_back(i);
// You tested 'multiple' before initializing it for every
// new prime value
for(multiple = i; multiple < 101; multiple += i)
{
nonPrime.push_back(multiple);
}
}
}
for(int i = 0; i < prime.size(); i++)
{
std::cout << prime[i] << std::endl;
}
return 0;
}
我选择了 "Programming Principles and Practice using C++",并且正在做一个涉及埃拉托色尼筛法的早期问题,我得到了意想不到的输出,但我无法确定问题到底是什么。这是我的代码:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> prime;
std::vector<int> nonPrime;
int multiple = 0;
for(int i = 2; i < 101; i++) //initialized to first prime number, i will
// be the variable that should contain prime numbers
{
for(int j = 0; j < nonPrime.size(); j++) //checks i against
// vector to see if
// marked as nonPrime
{
if(i == nonPrime[j])
{
goto outer;//jumps to next iteration if number
// is on the list
}
}
prime.push_back(i); //adds value of i to Prime vector if it
//passes test
for(int j = i; multiple < 101; j++) //This loop is where the
// sieve bit comes in
{
multiple = i * j;
nonPrime.push_back(multiple);
}
outer:
;
}
for(int i = 0; i < prime.size(); i++)
{
std::cout << prime[i] << std::endl;
}
return 0;
}
这个问题目前只要求我使用这种方法找到 100 以内的素数。我还尝试使用当前的 'goto' 方法在某些条件下跳出双循环,并且我还尝试在检查循环之后立即使用带有 if 语句的布尔标志并仅使用 "continue;" 语句并且都没有任何效果。
(老实说,我想既然人们说 goto 是邪恶的,也许它会产生我没有预见到的后果,这就是我试图将其关闭的原因)但问题并不要求我使用模块化函数,所以我假设它希望我在 main 中解决所有问题,因此我在 main 中使用嵌套循环的问题。哦,为了进一步说明我的输出问题,它似乎只将 2 的倍数添加到 nonPrime 向量,但其他所有内容都通过测试(例如 9)。
谁能帮我弄清楚哪里出错了?
鉴于这不是实现埃拉托色尼筛法的好方法,我将指出对您的代码的一些更改,以使其至少输出正确的序列。
另请注意,在第一个内循环之后,您选择的缩进有点误导。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> prime;
std::vector<int> nonPrime;
int multiple = 0;
for(int i = 2; i < 101; i++)
{
// you can use a flag, but note that usually it could be more
// efficiently implemented with a vector of bools. Try it yourself
bool is_prime = true;
for(int j = 0; j < nonPrime.size(); j++)
{
if(i == nonPrime[j])
{
is_prime = false;
break;
}
}
if ( is_prime )
{
prime.push_back(i);
// You tested 'multiple' before initializing it for every
// new prime value
for(multiple = i; multiple < 101; multiple += i)
{
nonPrime.push_back(multiple);
}
}
}
for(int i = 0; i < prime.size(); i++)
{
std::cout << prime[i] << std::endl;
}
return 0;
}