【发布时间】:2018-03-12 20:00:21
【问题描述】:
我学习了“使用 C++ 进行编程原理和实践”,并且正在做一个涉及 Eratosthenes 筛法的早期问题,但我得到了意外的输出,但我无法确定到底是什么问题。这是我的代码:
#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 语句的布尔标志,并简单地使用“继续”;声明,两者都没有任何效果。
(老实说,我认为既然人们说 goto 是邪恶的,也许它会产生我没有预见到的后果,这就是我试图将其切换出来的原因)但问题并不要求我使用模块化函数,所以我假设它希望我在 main 中解决所有问题,因此我在 main 中使用嵌套循环的问题。哦,为了进一步说明我的输出问题,它似乎只将 2 的倍数添加到 nonPrime 向量中,但其他所有内容都检查为通过测试(例如 9)。
谁能帮我理解我哪里出错了?
【问题讨论】:
-
大学辍学对软件开发行业来说并不是什么大事。公司不关心你的正规教育。无论如何,学术界在教授 CS 方面做得很糟糕。因此,请继续阅读书籍/在线参考资料。
-
@Ron 感谢您的鼓励,我非常感谢。这本书很枯燥,似乎以一种不利于学习的方式出现,但无论我是否继续前进,我仍然想至少了解我做错了什么。如果您不从中吸取教训,就无法从错误中改进,我从我的个人经验中知道这一点比我愿意承认的要好。另一方面,有书籍推荐吗?随时欢迎咨询!
-
不客气。不要太担心它。跳过它继续前进。熟悉该语言后,请阅读 Scott Meyers “Effective C++”书籍。 C++ 是一头奇怪而美丽的野兽。
-
注意:Eratosthenes 的筛子通常使用
bool的大数组来实现。vector::push-back将会变得昂贵,并且可能需要尽可能多的存储空间。 -
Wikipedia has a great page on it and how it works。演示 GIF 几乎可以告诉您您需要知道的所有事情。然后文本填充其余部分。
标签: c++ for-loop codeblocks primes sieve-of-eratosthenes