我目前正致力于下面所述的任务。我的问题是为什么我的代码只重复素数为2而不是剩余的数字。如果有人可以帮助我完成逻辑,我会非常感激,所以我可以尝试解决问题,而不是直接发布答案。感谢所有人:)
编写一个使用两个嵌套for循环和模数的程序 运算符(%)检测并打印从1到10,000的素数。 (素数是自然数,不能被整除 任何其他数字,除了他们自己和一个)。显示所有 素数被发现。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> n; // will store our values from 1-10000
for (int i= 0; i < 10000; i++) { // vector loading
n.push_back(i);
n[i]= n[i] + 1;
for (int j= 1; j < 10000 ; j++ ) { // Error is here?
if (n[j] % j == 0) { // supposed to go through all the numbers
// and flag the prime numbers
cout<<n[i] <<" is a prime";
i++;
break;
}
}
}
return 0;
}
答案 0 :(得分:2)
琐碎的方法很容易理解。
外循环(假设此处的循环变量为num
)从2到10000,并检查每个数字是否为素数。
内部循环(假设此处的循环变量为fact
)通过表单2到num - 1
根据num
检查fact
是否有[{1}}因子。如果num % fact == 0
是fact
的因子,则打破内循环并继续检查下一个数字。
如果检查了从2到num
的所有数字并且其中没有一个是num - 1
因子,那么我们确定num
是素数并继续检查下一个号码。
请注意,0和1是特殊情况,因此我们将它们从循环中排除。
这种方法不需要任何数组。时间复杂度为O(n 2 ),空间复杂度为O(1)。
BTW,还有其他更好的解决方案,例如Sieve of Eratosthenes。答案 1 :(得分:1)
有一些问题,但首先考虑第一个循环。
i = 0
n.push_back(i); // Now n[0] is now valid (having the value 0)
n[0] = n[0] + 1; // Now n[0] is still valid (having the value 1)
j = 1;
if (n[j] % j == 0) // Ups... access to n[1] which is invalid
// as you have only pushed one element, i.e. n[0]
答案 2 :(得分:1)
外部循环是提供数字的那个,因此你 不需要矢量
内部循环是进行检查的内容
内循环检查数字是否不 prime。唯一的方法吧 知道这是因为外环提供的数字不可被内环提供的任何数字整除。因此内循环 没有打印任何东西,因为它必须在它知道数字为素数之前耗尽所有检查
您的打印声明应该是最后的。这意味着它应该在内部循环之后但仍然在外部循环内部,并且如果它是基于内部循环发现的素数的话,它应该打印数字。所以你应该知道内循环是否找到了素数
最后请注意,内部循环必须从2
开始并以i - 1
结束,因为每个数字都可以被1和它自身整除
答案 3 :(得分:0)
不需要遍历内循环的整个范围,对于内循环,可能的值从2开始到&lt; =那个数字/ 2 。
如果您想检查99是否为素数,那么您需要 将内循环设置为2到49(99/2是最大可能因子 这个数字)所以不要遍历其余部分。
因此,如果你将内部循环从2迭代到98,那么它意味着更少 在49之后迭代这个循环,想一想。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//vector<int> n; // will store our values from 1-10000
int flag =0;
for (int i= 2; i < 10000; i++) // vector loading
{
//n.push_back(i);
//n[i]= n[i] + 1;
flag =0;
for (int j= 2; j <= i / 2 ; j++ )
{
if (i % j == 0)
{
flag = 1;
break;
}
}
if(flag == 0)
{
cout << "%d number is Prime" << i;
}
}
return 0;
}