我这里有代码,程序列出3-100的所有素数。我的主要问题是该程序只打印出三个。我认为由于某种原因它会离开循环或其他东西。我在for语句中放了一个中断,一旦发现数字不是素数就立即离开内部for循环,以便它可以打印出来。但是,它似乎没有起作用。
#include <iostream>
#include <conio.h>
#include <cmath>
using namespace std;
int main()
{
bool prime = true;
for (int x = 3; x <= 100; x++)
{
for (int y = 2; y <= (x - 1); y++)
{
if ((x % y) == 0)
prime = false;
break;
}
if (prime == true)
cout<<x<<endl;
}
getche();
return 0;
}
答案 0 :(得分:6)
问题是:
for (int y = 2; y <= (x - 1); y++)
{
if ((x % y) == 0)
prime = false;
break;
}
什么时候应该
for (int y = 2; y <= (x - 1); y++)
{
if ((x % y) == 0)
{
prime = false;
break;
}
}
除非满足第一个条件,否则每次将prime
设置为true时都会中断。
您还必须在每次迭代时将prime
重置为true:
for (int x = 3; x <= 100; x++)
{
prime = true;
答案 1 :(得分:2)
当你将prime设置为false表示单个数字不是素数时,你永远不会再将prime设置为true。
答案 2 :(得分:2)
在第一个for循环内的第一行,输入:
prime = true;
目前,您从未将prime
标记重置为true
,因此当您到达4并将prime
设置为false
时,它永远不会“找到”之后的素数,因为prime
总是为假。
完整代码:
#include <iostream>
#include <conio.h>
#include <cmath>
using namespace std;
int main()
{
bool prime = true;
for (int x = 3; x <= 100; x++)
{
prime = true;
for (int y = 2; y <= (x - 1); y++)
{
if ((x % y) == 0)
{
prime = false;
break;
}
}
if (prime == true)
cout<<x<<endl;
}
getche();
return 0;
}
答案 3 :(得分:1)
在第一个循环初始化 prime = true; 之后。因为一旦素数是假的,它就不会再次成真。
for (int x = 3; x <= 100; x++)
{
prime=true;
///rest of the code
}
答案 4 :(得分:1)
你永远不会重置素数是真的。在你cout之后你需要做 prime = true;
答案 5 :(得分:0)
试试这个。
for (int x = 3; x <= 100; x++)
{
for (int y = 2; y <= (x - 1); y++)
{
if ((x % y) == 0)
break;
if((x-1)==y)
cout<<x<<endl;
}
}
答案 6 :(得分:0)
内部循环将始终调用break语句,因为IF只执行第一行,因为它没有包含在括号中。您还需要为每个数字重置bool变量(即在第一个循环内)
if ((x % y) == 0)
{
prime = false;
break; // previously it was always breaking
}
以前基本上是这样做的:
if ((x % y) == 0)
{
prime = false;
}
break; // WRONG!
答案 7 :(得分:0)
int main()
{
for (int x = 3; x <= 100; x++)
{
bool prime = true;
for (int y = 2; y <= (x - 1); y++)
{
if ((x % y) == 0)
{
prime = false;
break;
}
}
if (prime == true)
{
cout<<x<<endl;
}
}
getche();
return 0;
}
你需要在循环中设置prime,并且你想将它设置为false并在你的内循环中打破测试。
旧手的尖端编号45623,即使你可以跳过括号如果代码块是一行,也不要。
答案 8 :(得分:0)
正如每个人都这样说你有2个错误:
1)您永远不会重置prime
的值,因此请添加prime = true
以开始外for
。
2)将if ((x % y) == 0) prime = false; break;
转换为if ((x % y) == 0) {prime = false; break;}
,否则将只执行一次!!
答案 9 :(得分:0)
这是一个用于打印3到100之间素数的代码。 使用计数器变量n而不是通用算法来查找素数。
#include <iostream.h>
#include <conio.h>
int main() {
int i;
int j;
clrscr();
int count=0;
for(j=100; j>=3; j--) {
for(int i=1; i<=j; i++) {
if(j%i==0)
count++;
}
if(count==2)
cout<<"\n"<<j;
count=0;
}
getch();
}
答案 10 :(得分:0)
为效率尝试这个 它的java版本,但你可以为C尝试相同的逻辑。
boolean prime;
int iCount = 0;
int jCount = 0;
for(i = 2; i <= 100; i++)
{
iCount += 1;
prime = true;
int squared = (int) (Math.sqrt(i));
for(j = 2; j < squared; j++){
jCount += 1;
if(i%j == 0) prime = false;
}
if(prime) System.out.print(i+" ");
}