我正在尝试使用此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 <<;
}
}
问题在于我认为接近逻辑,但是那些三分之二和二十分之一仍然出现在素数之间。我做错了什么?
答案 0 :(得分:1)
我修改了你的代码,并在我做了更改的地方添加了评论
这里的关键是要理解你需要检查所有小于“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;
}
}
答案 1 :(得分:1)
已经给出了许多答案,解释了如何做到这一点。没有人回答这个问题:
我做错了什么?
所以我会尝试一下。
#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;
}
}
答案 2 :(得分:0)
您的代码中有多处错误。
最简单的算法(虽然不是最优的算法)是检查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;
}
}
}
答案 3 :(得分:0)
我几乎可以猜测它的学术任务:)
所以在这里考虑素数有很多方法可以获得数字&#34;有些人更糟糕一些。
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
}
小注意,我从here为Sive提供了简单的实现代码(写下这个注释,因此它不是非法的,真相被告知想要显示它很容易找到)
答案 4 :(得分:0)
我建议删除确定数字是否是单独函数的素数的逻辑,从main
调用函数然后相应地创建输出。
// Declare the function
bool is_prime(int num);
然后,将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;
}