数字 3、5 和 7 未显示为素数
Numbers 3, 5, and 7 not being displayed as prime
我需要创建一个在两个输入数字之间生成素数的函数。我通过测试范围内每个数字的素数来做到这一点。问题是数字 3、5 或 7 永远不会显示。我不确定出了什么问题。
这就是我测试数字素数的方式:
bool isPrime(int number){
using namespace std;
if((number%2==0) || (number%3==0) || (number%4==0) || (number%5==0) ||
(number%6==0) || (number%7==0) || (number%8==0) || (number%9==0))
{
return false;
}
else if ((number/1==number) && (number/number==1))
{
return true;
}
}
3 是 3 的倍数。 5 是 5 的倍数。 7 是 7 的倍数。您编写的代码为 3、5 或 7 的任意倍数返回 false,因此它不可能为这些数字返回 true。您只需要检查小于您正在检查的数字的素数的可除性。
您还可以检查许多不必要的合数的可整除性;例如,一个数字不能是 4 的倍数而不是 2 的倍数,它不能是 6 的倍数而不是 2 和 3 的倍数。这些检查除了浪费时间外什么也做不了。
最后,从长远来看,你的代码在100%的时间内都是错误的,因为它检查的最高素数是7。它会说 169 (13 * 13( 是素数,因为它不能被你检查的任何数字整除,但它显然是复合的。对于试验除法,您需要检查所有小于或等于 floor(sqrt(n((的素数(,要么通过对复合进行大量不必要的检查,要么通过随时建立素数列表(类似于埃拉托色尼筛,通常由 CS 类型调用,但我认为它不是严格等价的(。
一个非常简单(但不是那么有效(的方法:
bool is_prime(int i)
{
int root = (int)std::sqrt(i);
bool result = true;
for (int j = 2; j <= root; ++j)
{
if (i % j == 0)
{
result = false;
break;
}
}
return result;
}
你可能想看看这篇文章。
这是一种寻找质数的系统方法。使用此算法不断查找素数,直到达到输入的上限值。
看看这行代码:
if((number%2==0) || (number%3==0) ||
(number%4==0) || (number%5==0) ||
(number%6==0) || (number%7==0) ||
(number%8==0) || (number%9==0))
return false;
想想如果你插入 2、3、5 或 7 会发生什么。 在每种情况下,您都会发现数字 mod 2、mod 3、mod 5 或 mod 7 确实为零,因此您的代码将返回 false。 这可能解释了为什么你得到这些数字不算作素数。
但是现在看看下一句话:
else if ((number/1==number) && (number/number==1)){
return true;
}
在什么情况下这是错误的? 每个数除以一都是它自己,每个数除以自身都是一,所以每个数字都通过了这个测试。 因此,您的代码将在任何数字上返回 true,只要它不能被 2、3、4、5、6、7、8 或 9 整除。 尝试插入 11 x 13 = 143。 这个数字不是素数,但你的函数会说它是。
其他人已经发布了您可以采取的其他途径来解决问题,但从根本上说,我认为问题是,如果没有 1 以外的数字并且本身是除数,则数是素数。 你的函数需要以某种方式考虑这一点,可能是通过检查它下面所有不是一个或本身的数字。 正如一些答案所提出的那样,可以进一步优化这一点,但您应该意识到,在基本层面上,这是需要做的。
希望这有帮助!
或者您可以使用此算法:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
int num;
int count = 0;
cout << "Enter your range: ";
cin >> num;
for(int i = 1; i <= num; i++)
{
count = 0;
for(int j = 2; j <= sqrt(i); j++)
{
if(i % j == 0)
{
count++;
break;
}
}
if(count == 0 && i != 1)
cout << i << " ";
}
cout << endl;
}
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在 txt 文件中显示前两个数字的程序
- 为什么strlen(s)与s的大小不同,为什么cout-char显示的是字符而不是数字
- 为什么 sf::Text 显示点而不是数字?
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 未来值公式显示疯狂巨大数字的输出
- 为什么当我在 c++ 中运行函数时,我的代码显示数字 53
- 代码以查找数组中的最大数字,但它仅将第一个数字显示为最大数字. 有人请告诉我为什么
- 无法在C++中显示反转的数字
- 如何执行此程序,将键入的数字显示为数字值的多次
- C++编译器只显示数字,不显示正确的输出
- 使用 "For Loop" 按以下顺序显示数字
- 数字范围和显示数字重复c++
- 使用while循环来计数和显示数字
- 如何在C++中显示数字变量
- 显示数字序列
- 在c++中,如何使用iostream和iomanip在不显示数字的情况下进行舍入?
- 浮动显示0数字后1.5
- Setprecision不显示数字