[英]Printing all prime numbers between 3-100 in C++
我在这里有该程序的代码,以列出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;
}
问题是:
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;
当您将prime设置为false表示单个数字不是质数时,就永远不会再次将prime设置为true。
在第一个for循环内的第一行,输入以下内容:
prime = true;
当前,您永远不会将prime
标志重置为true
,因此,当您达到4并将prime
设置为false
,由于prime
始终为false
,因此它永远不会“查找”素数。
完整代码:
#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;
}
在第一个循环后初始化prime = true; 。 因为一旦素数为假,它就不会再次变为真。
for (int x = 3; x <= 100; x++)
{
prime=true;
///rest of the code
}
您永远不会将素数重置为真实。 发出提示后,您需要执行prime = true;
尝试这个。
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;
}
}
内部循环将始终调用break语句,因为IF仅执行第一行,因为它没有被括在括号中。 另外,您需要为每个数字重置bool变量(即在第一个循环内)
if ((x % y) == 0)
{
prime = false;
break; // previously it was always breaking
}
以前基本上是这样做的:
if ((x % y) == 0)
{
prime = false;
}
break; // WRONG!
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;
}
您需要在循环内部设置质数,并且想要将其设置为false并在内部循环中终止测试。
即使代码块为一行,即使您可以跳过花括号,旧手的笔尖编号45623也不要。
每个人都说这两个错误:
1)你永远不重置价值prime
,所以加一个prime = true
开始外for
。
2)转换if ((x % y) == 0) prime = false; break;
if ((x % y) == 0) prime = false; break;
到if ((x % y) == 0) {prime = false; break;}
if ((x % y) == 0) {prime = false; break;}
否则,内部for将仅执行一次!
这是一个用于打印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();
}
为了提高效率,请尝试使用它的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+" ");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.