[英]How can I display only prime numbers in this code?
我正在尝试使用此C ++代码获取2范围内的所有质数和输入值:
#include<iostream>
using namespace std;
int main() {
int num = 0;
int result = 0;
cin >> num;
for (int i = 2; i <= num; i++) {
for (int b = 2; b <= num; b++) {
result = i % b;
if (result == 0) {
result = b;
break;
}
}
cout << result<< endl <<;
}
}
问题是我认为逻辑越来越接近,但是那些三三两两在素数之间不断出现。 我究竟做错了什么?
我已经修复了您的代码,并在进行更改的地方添加了注释
此处的关键是要理解,如果其中一个数除以“ i”,则需要检查所有小于“ i”的数字,如果是,则将该数字标记为非素数和中断(中断仅是优化)
然后仅打印那些通过“测试”的人(最初您打印了所有内容)
#include <iostream>
using namespace std;
#include<iostream>
using namespace std;
int main()
{
int num = 0;
int result = 0;
cin >> num;
for (int i = 2; i <= num; i++) {
bool isPrime = true; // Assume the number is prime
for (int b = 2; b < i; b++) { // Run only till "i-1" not "num"
result = i % b;
if (result == 0) {
isPrime = false; // if found some dividor, number nut prime
break;
}
}
if (isPrime) // print only primes
cout << i << endl;
}
}
已经给出了许多答案,说明了如何执行此操作。 没有人回答这个问题:
我究竟做错了什么?
因此,我将尝试一下。
#include<iostream>
using namespace std;
int main() {
int num = 0;
int result = 0;
cin >> num;
for (int i = 2; i <= num; i++) {
for (int b = 2; b <= num; b++) { // wrong: use b < i instead of b <= num
result = i % b;
if (result == 0) {
result = b; // wrong: why assign result the value of b?
// just remove this line
break;
}
}
cout << result<< endl <<; // wrong: you need a if-condtion before you print
// if (result != 0) cout << i << endl;
}
}
您的代码中有多个错误。
最简单的算法(虽然不是最佳算法)是用于检查N是否为素数,只是用于检查其是否在范围内[2; N-1]。
这是工作版本:
int main() {
int num = 0;
cin >> num;
for (int i = 2; i <= num; i++) {
bool bIsPrime = true;
for (int b = 2; bIsPrime && b < i; b++) {
if (i % b == 0) {
bIsPrime = false;
}
}
if (bIsPrime) {
cout << i << endl;
}
}
}
我几乎可以猜到它的学术任务:)
因此在这里,对于质数的想法有很多“获取质数bf数”的方法,有些方法更好一些,有些则更糟。
Erosthenes Sieve是其中之一,它的概念非常简单,但是在有大量数字(例如几百万)的情况下效率更高,因为OopsUser版本正确,因此您可以尝试自己查看哪种版本更好
void main() {
int upperBound;
cin >> upperBound;
int upperBoundSquareRoot = (int)sqrt((double)upperBound);
bool *isComposite = new bool[upperBound + 1]; // create table
memset(isComposite, 0, sizeof(bool) * (upperBound + 1)); // set all to 0
for (int m = 2; m <= upperBoundSquareRoot; m++) {
if (!isComposite[m]) { // if not prime
cout << m << " ";
for (int k = m * m; k <= upperBound; k += m) // set all multiplies
isComposite[k] = true;
}
}
for (int m = upperBoundSquareRoot; m <= upperBound; m++) // print results
if (!isComposite[m])
cout << m << " ";
delete [] isComposite; // clean table
}
小注释,我从这里开始为Sive获取了简单的实现代码(编写此注释的目的不是非法的,事实是想告诉它以易于查找)
我建议退出确定数字是否为单独函数的质数的逻辑,从main
调用该函数,然后相应地创建输出。
// Declare the function
bool is_prime(int num);
然后,将for
循环简化for
:
for (int i = 2; i <= num; i++) {
if ( is_prime(i) )
{
cout << i << " is a prime.\n";
}
}
然后实现is_prime
:
bool is_prime(int num)
{
// If the number is even, return true if the number is 2 else false.
if ( num % 2 == 0 )
{
return (num == 2);
}
int stopAt = (int)sqrt(num);
// Start the number to divide by with 3 and increment it by 2.
for (int b = 3; b <= stopAt; b += 2)
{
// If the given number is divisible by b, it is not a prime
if ( num % b == 0 )
{
return false;
}
}
// The given number is not divisible by any of the numbers up to
// sqrt(num). It is a prime
return true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.