我必须创建一个函数,它使用两个先前引用的输入来显示两个数字之间的所有素数,输入称为imin,imax和我们给出的代码部分是
cout << "Primes:";
for (int j = imin; j <= imax; j++) {
if (is_prime(j))
{
cout << " " << j;
}
}
应该由我们自己编写的函数补充,我所做的部分在
之下bool is_prime( int j)
{
bool primes(false);
for (int k = 2; k < j; k++)
{
if (j%k == 0) // if (k mod j == 0)
{
primes = true;
}
else if (j%k !=0)
{
primes = false;
}
}
return true;
}
我需要帮助才能显示素数,因为它现在显示所有数字。感谢您对我的帮助,所以希望我足够具体。
答案 0 :(得分:4)
你职能的最后一行: 返回true
无论数字是否为素数,总是返回true,这就是显示所有数字的原因。如果您传递任何号码&#39; n&#39;作为 is_prime(n)的参数,它将始终返回true。
答案 1 :(得分:2)
我找到了三个错误:
bool primes(false);
j%k == 0
,但在您的代码中,您有相反的内容答案 2 :(得分:1)
#include <iostream>
using namespace std;
bool is_prime( int j)
{
bool primes(true);
for (int k = 2; k < j; k++)
{
if (j%k == 0) // if (k % j == 0)
{
primes = false;
}
}
return primes;
}
int main( void )
{
int imax = 100;
int imin = 1;
cout << "Primes:";
for (int j = imin; j <= imax; j++) {
if (is_prime(j))
{
cout << " " << j;
}
}
return 0;
}
答案 3 :(得分:1)
自己写这个函数比用坏英语解释为什么你的函数错误更简单。:)
bool is_prime( unsigned int value )
{
bool prime = ( value == 2 ) || ( value % 2 && value != 1 );
for ( unsigned int j = 3; prime && j < value / 2; j += 2 )
{
prime = value % j != 0;
}
return prime;
}
for语句可以作为
for ( unsigned int j = 3; prime && j * j <= value; j += 2 )
答案 4 :(得分:1)
您的代码中有一些错误。
首先,当j%k等于零时,该数字不是素数。 其次,你必须处理数字inf到2号。他们需要特殊待遇。
我在你的代码中添加了一些内容。请看一下:
bool is_prime(int j)
{
for (int k = 2; k < j; k++)
if (j % k == 0)
return (false);
if (j < 2)
return (false);
return (true);
}
让我们看看它如何与一个例子一起使用!
如果数字(j)小于2,则该函数将跳过循环并返回false。说这个数字不是素数。
如果数字(j)高于2,则该函数将进入循环。循环如何工作?
假设j是数字5,这是循环:
if (j % k == 0) With k moving from 2 to (j - 1) so 4
if (5 % 2 == 0) -> false, loop continue
if (5 % 3 == 0) -> false, loop continue
if (5 % 4 == 0) -> false, loop continue
循环停止原因k等于j。 函数返回true,数字5是素数。
现在假设j是数字10,让我们看看有什么变化:
if (j % k == 0) With k moving from 2 to (j - 1) so 9
if (10 % 2 == 0) -> true, function return false
10号不是素数
如果您有任何疑问,欢迎您。 :)
答案 5 :(得分:1)
你的代码中有错误,素数只有两个因子是1和数字本身,所以代码应该如下:
bool is_prime( int j)
{
bool primes(false);
for (int k = 2; k < j; k++)
{
if (j%k == 0) // if (k mod j == 0)
{
primes = false;
break; //if number is divisible in between then retrun false and break the loop
}
else if (j%k !=0)
{
primes = true;
}
}
return primes;
}
尝试使用该代码并告知我是否发生错误
答案 6 :(得分:0)
首先,你应该删除任何甚至主要候选人:
if (imin < 2) // no primes < 2 :
return;
cout << "Primes:";
if (imin == 2)
cout << " " << i;
imin = imin + ((imin & 0x1) == 0); // advance to next odd number.
这允许您使用以下方法测试素数:
for (int j = imin; j <= imax; j += 2) // odd candidates (j > 2) only:
{
if (is_prime(j))
cout << " " << j;
}
请注意,如果j
足够大,有更有效的方法来测试素数。但是,如果您希望最少的代码有效,则只需要测试最高floor(sqrt(j))
的素数因子:
bool is_prime (int j)
{
// assert (j > 2 && (j & 0x1) == 1); // j > 2, j in odd:
int d, q, c = 0;
for (d = 3; !c && (q = j / d) >= d); d += 2)
c = (q * d == j); // sets c <- 1 if 'd' is a factor of 'j'
return (c == 0); // prime (true - no 'd' factor) or composite (false)
}