我已经做了几天的作业问题,似乎无法得到正确的输出(我已经尝试了很多东西!)问题是:
编写一个程序,它使用两个嵌套的for循环和模数运算符(%)来检测和打印从1到10,000的素数。
我从1到10做了一个小测试,以确保它的工作。我得到2,3,5,7,9作为我的输出,所以我知道出了什么问题。当我将数字从10增加到20时,它会打印2加上所有奇数。我在下面包含我的代码。谢谢!
int main() {
for (int i=2; i <=10; i++){
for (int j=2; j<=i; j++){
if (i%j==0 && j!=i) {
break;
}
else {
cout<< i <<endl;
break;
}
}
}
}
答案 0 :(得分:2)
除了Sumit Jindal的回答,内循环也可以这样做:
for(int j=2; j*j<=i ; j++)
如果我们考虑满足x * y = i的每个(x,y)有序对,x的最大值可以是i的平方根。
答案 1 :(得分:1)
问题在于if-else分支。你的内部循环将只运行一次,因为它会因你的if else分支而脱离内部循环。
首次进入内循环时, j的值为2 。您的条件将测试变量i 是否可被2整除。如果是,它会中断。其他明智的(你的其他分支)将打印 i 的值并突破。 因此打印奇数。
中断内循环并检查外循环中 j是否等于。您必须使 j 可用于外部循环。
答案 2 :(得分:0)
你的print语句在内循环中,它不应该 - 如果你在内循环中一直运行而没有找到除数,它只是一个素数。
作为第二点,你只需要检查除了i的平方根之外的除数,而不是一直到i。
答案 3 :(得分:0)
你是在第一次迭代后打破内循环,这是检查数字(即 i )是否与 j 不同,并且可以被2整除(因为第一次迭代的 j = 2 )
我得到2,3,5,7,9作为我的输出
这是因为每个奇数都会在 if 时失败并打印在 else 条件
答案 4 :(得分:0)
代码中的小修正,添加标记。你也不需要运行内循环i次,事实上只有i / 2次就足够了。这是简单的数学,但会节省大量的CPU周期(在你的情况下约为5000次迭代)
#include <iostream>
int main()
{
int n = 10;
for(int i=2; i<=n; i++){
bool isPrime = true;
for(int j=2; j<=i/2; j++){
if(i!=j && i%j==0){
isPrime = false;
break;
}
}
if(isPrime)
std::cout << i << " ";
}
return 0;
}
答案 5 :(得分:0)
另一个版本,如果你不介意以相反的顺序输出。
int n = 10;
for (int i = n; i > 1; --i)
{
int factorCount = 0;
for (int j = 2; j <= n; ++j)
{
if (i % j == 0)
factorCount++;
if (factorCount > 1)
break;
}
if (factorCount == 1)
cout << i << endl;
}
答案 6 :(得分:-2)
int main() {
for (int i = 2; i <= 100; i++) {
for (int j = 2; j < i; j++) {
if (i%j == 0)
break;
if (j==i-1) // means has never run previous if blog
cout << i << endl;
}
}
return 0;
}