我已经在这个主题上仔细阅读了很多代码,但是大多数代码都生成了一直到输入数字为止的数字。但是,我需要的代码只检查给定的输入数是否为素数。
这是我能够写的,但它不起作用:
void primenumber(int number)
{
if(number%2!=0)
cout<<"Number is prime:"<<endl;
else
cout<<"number is NOt prime"<<endl;
}
如果有人能就如何正常工作给我建议,我将不胜感激。
我修改它以检查for循环中的所有数字。
void primenumber(int number)
{
for(int i=1; i<number; i++)
{
if(number%i!=0)
cout<<"Number is prime:"<<endl;
else
cout<<"number is NOt prime"<<endl;
}
}
答案 0 :(得分:35)
bool isPrime(int number){
if(number < 2) return false;
if(number == 2) return true;
if(number % 2 == 0) return false;
for(int i=3; (i*i)<=number; i+=2){
if(number % i == 0 ) return false;
}
return true;
}
答案 1 :(得分:33)
我自己的IsPrime()函数,基于着名的Rabin-Miller算法的确定性变体编写,结合优化的步骤强制执行,为您提供最快的主要测试功能之一。
__int64 power(int a, int n, int mod)
{
__int64 power=a,result=1;
while(n)
{
if(n&1)
result=(result*power)%mod;
power=(power*power)%mod;
n>>=1;
}
return result;
}
bool witness(int a, int n)
{
int t,u,i;
__int64 prev,curr;
u=n/2;
t=1;
while(!(u&1))
{
u/=2;
++t;
}
prev=power(a,u,n);
for(i=1;i<=t;++i)
{
curr=(prev*prev)%n;
if((curr==1)&&(prev!=1)&&(prev!=n-1))
return true;
prev=curr;
}
if(curr!=1)
return true;
return false;
}
inline bool IsPrime( int number )
{
if ( ( (!(number & 1)) && number != 2 ) || (number < 2) || (number % 3 == 0 && number != 3) )
return (false);
if(number<1373653)
{
for( int k = 1; 36*k*k-12*k < number;++k)
if ( (number % (6*k+1) == 0) || (number % (6*k-1) == 0) )
return (false);
return true;
}
if(number < 9080191)
{
if(witness(31,number)) return false;
if(witness(73,number)) return false;
return true;
}
if(witness(2,number)) return false;
if(witness(7,number)) return false;
if(witness(61,number)) return false;
return true;
/*WARNING: Algorithm deterministic only for numbers < 4,759,123,141 (unsigned int's max is 4294967296)
if n < 1,373,653, it is enough to test a = 2 and 3.
if n < 9,080,191, it is enough to test a = 31 and 73.
if n < 4,759,123,141, it is enough to test a = 2, 7, and 61.
if n < 2,152,302,898,747, it is enough to test a = 2, 3, 5, 7, and 11.
if n < 3,474,749,660,383, it is enough to test a = 2, 3, 5, 7, 11, and 13.
if n < 341,550,071,728,321, it is enough to test a = 2, 3, 5, 7, 11, 13, and 17.*/
}
使用,复制并粘贴代码到程序顶部。调用它,它返回一个BOOL值,无论是真还是假。
if(IsPrime(number))
{
cout << "It's prime";
}
else
{
cout<<"It's composite";
}
如果您在使用“__int64”进行编译时遇到问题,请将其替换为“long”。它在VS2008和VS2010下编译得很好。
工作原理: 该功能有三个部分。部分检查它是否是极少数例外(负数,1)之一,并拦截程序的运行。
如果数字小于1373653,则第二部分开始,这是理论上Rabin Miller算法将击败我的优化强力函数的数字。接下来是两个级别的拉宾米勒,旨在尽量减少所需证人的数量。由于您将要测试的大多数数字都在40亿以下,因此通过检查见证人2,7和61可以使概率性Rabin-Miller算法具有确定性。如果您需要超过40亿的上限,则需要大量数字库,并对power()函数应用模数或位移修改。
如果你坚持使用蛮力方法,这里只是我优化的蛮力IsPrime()函数:
inline bool IsPrime( int number )
{
if ( ( (!(number & 1)) && number != 2 ) || (number < 2) || (number % 3 == 0 && number != 3) )
return (false);
for( int k = 1; 36*k*k-12*k < number;++k)
if ( (number % (6*k+1) == 0) || (number % (6*k-1) == 0) )
return (false);
return true;
}
}
这个暴力作品如何运作: 所有素数(除了2和3)都可以用6k + 1或6k-1的形式表示,其中k是正整数。此代码使用此事实,并以比所讨论数字的平方根小6k + 1或6k-1的形式测试所有数字。这件作品已集成到我的大型IsPrime()函数中(首先显示的功能)。
如果您需要查找数字下方的所有素数,请查找1000以下的所有素数,查看Eratosthenes的Sieve。我的另一个最爱。
另外需要注意的是,我希望看到有人实现Eliptical Curve Method算法,一直希望看到用C ++实现一段时间,我失去了它的实现。从理论上讲,它甚至比我实施的确定性Rabin Miller算法更快,尽管我不确定这对40亿以下的数字是否正确。
答案 2 :(得分:13)
你需要做更多的检查。现在,你只是检查这个数字是否可以被2整除。对于2,3,4,5,6,......同样为number
。提示:使用循环。
解决此问题后,请尝试查找优化。 提示:您只需要检查所有数字,直到数字的平方根
答案 3 :(得分:5)
如果(输入%number!= 0)返回false,我猜想将sqrt和foreach从2运行到sqrt + 1; 一旦达到sqrt + 1,你就可以确定它的最佳状态。
答案 4 :(得分:3)
<强> C ++ 强>
bool isPrime(int number){
if (number != 2){
if (number < 2 || number % 2 == 0) {
return false;
}
for(int i=3; (i*i)<=number; i+=2){
if(number % i == 0 ){
return false;
}
}
}
return true;
}
<强>的Javascript 强>
function isPrime(number)
{
if (number !== 2) {
if (number < 2 || number % 2 === 0) {
return false;
}
for (var i=3; (i*i)<=number; i+=2)
{
if (number % 2 === 0){
return false;
}
}
}
return true;
}
<强>的Python 强>
def isPrime(number):
if (number != 2):
if (number < 2 or number % 2 == 0):
return False
i = 3
while (i*i) <= number:
if(number % i == 0 ):
return False;
i += 2
return True;
答案 5 :(得分:3)
如果您知道输入的范围(由于函数采用int
而执行),您可以预先计算小于或等于最大输入的平方根的素数表(2 ^ 31在这种情况下为-1),然后通过表中每个素数小于或等于给定数字的平方根来测试可分性。
答案 6 :(得分:3)
bool check_prime(int num) {
for (int i = num - 1; i > 1; i--) {
if ((num % i) == 0)
return false;
}
return true;
}
检查任何数字(如果是素数
)答案 7 :(得分:2)
使用数学首先找到数字的平方根然后开始循环,直到数字结束后你得到平方根。 检查每个值是否给定的数字是否可被迭代值整除。如果任何值除以给定的数字,则它不是素数,否则为素数。 这是代码
bool is_Prime(int n)
{
int square_root = sqrt(n); // use math.h
int toggle = 1;
for(int i = 2; i <= square_root; i++)
{
if(n%i==0)
{
toggle = 0;
break;
}
}
if(toggle)
return true;
else
return false;
}
答案 8 :(得分:2)
我遵循相同的算法但不同的实现循环到sqrt(n),步骤2只有奇数,因为我检查它是否可以被2或2 * k整除它是假的。这是我的代码
public class PrimeTest {
public static boolean isPrime(int i) {
if (i < 2) {
return false;
} else if (i % 2 == 0 && i != 2) {
return false;
} else {
for (int j = 3; j <= Math.sqrt(i); j = j + 2) {
if (i % j == 0) {
return false;
}
}
return true;
}
}
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 1; i < 100; i++) {
if (isPrime(i)) {
System.out.println(i);
}
}
}
}
答案 9 :(得分:2)
如果你很懒,并且拥有大量内存,请创建一个sieve of Eratosthenes,这实际上是一个巨大的阵列,你可以从中踢出所有不是素数的数字。 从那时起,每次素数“概率”测试都会非常快速。 此解决方案的快速结果的上限是RAM的数量。超低结果的此解决方案的上限是您的硬盘容量。
答案 10 :(得分:2)
此代码仅检查该数字是否可被2整除。对于一个数字是素数,它不能被所有小于其自身的整数整除。这可以通过检查它是否可被循环中小于floor(sqrt(n))
的所有整数整除来实现。如果您有兴趣,则存在一些much faster algorithms。
答案 11 :(得分:1)
上面有人有以下内容。
bool check_prime(int num) {
for (int i = num - 1; i > 1; i--) {
if ((num % i) == 0)
return false;
}
return true;
}
这大部分都有效。我刚刚在Visual Studio 2017中测试过它。它会说小于2的任何东西也是素数(所以1,0,-1等)
这是一个稍作修改来纠正这个问题。
bool check_prime(int number)
{
if (number > 1)
{
for (int i = number - 1; i > 1; i--)
{
if ((number % i) == 0)
return false;
}
return true;
}
return false;
}
答案 12 :(得分:0)
这个问题有几种不同的方法 “朴素”方法:尝试所有(奇数)数字,直到数字的根(。) 改进的“天真”方法:每6n±1只尝试一次 概率测试:Miller-Rabin,Solovay-Strasse等。
哪种方法适合您,以及您使用素数做什么 您至少应该阅读Primality Testing。
答案 13 :(得分:0)
如果n为2,那就是素数。
如果n为1,则不是素数。
如果n是偶数,则不是素数。
如果n是奇数,大于2,我们必须检查所有奇数3..sqrt(n)+1,如果这个数字中的任何一个可以除n,n不是素数,否则,n是素数。
为了获得更好的性能,我建议使用eratosthenes筛。
以下是代码示例:
<from uri="quartz2://processTimers?cron=5+*+*+*+*+*" /> <to uri="mybatis:selectProducts?statementType=SelectList&onConsume=consumeProduct"/> <bean ref="productService" method="process" /> <to uri="mq:queue:my.queue"/>
答案 14 :(得分:0)
我想出了这个:
int counter = 0;
bool checkPrime(int x) {
for (int y = x; y > 0; y--){
if (x%y == 0) {
counter++;
}
}
if (counter == 2) {
counter = 0; //resets counter for next input
return true; //if its only divisible by two numbers (itself and one) its a prime
}
else counter = 0;
return false;
}
答案 15 :(得分:0)
I Have Use This Idea For Finding If The No. Is Prime or Not:
#include <conio.h>
#include <iostream>
using namespace std;
int main() {
int x, a;
cout << "Enter The No. :";
cin >> x;
int prime(unsigned int);
a = prime(x);
if (a == 1)
cout << "It Is A Prime No." << endl;
else
if (a == 0)
cout << "It Is Composite No." << endl;
getch();
}
int prime(unsigned int x) {
if (x == 1) {
cout << "It Is Neither Prime Nor Composite";
return 2;
}
if (x == 2 || x == 3 || x == 5 || x == 7)
return 1;
if (x % 2 != 0 && x % 3 != 0 && x % 5 != 0 && x % 7 != 0)
return 1;
else
return 0;
}
答案 16 :(得分:0)
这是一种快速有效的方法:
bool isPrimeNumber(int n) {
int divider = 2;
while (n % divider != 0) {
divider++;
}
if (n == divider) {
return true;
}
else {
return false;
}
}
它将开始查找n的整数,从2开始。一旦找到一个整数,如果该数字等于n,则它是质数,否则就不是。
答案 17 :(得分:0)
//simple function to determine if a number is a prime number
//to state if it is a prime number
#include <iostream>
using namespace std;
int isPrime(int x); //functioned defined after int main()
int main()
{
int y;
cout<<"enter value"<<endl;
cin>>y;
isPrime(y);
return 0;
} //end of main function
//-------------function
int isPrime(int x)
{
int counter =0;
cout<<"factors of "<<x<<" are "<<"\n\n"; //print factors of the number
for (int i =0; i<=x; i++)
{
for (int j =0; j<=x; j++)
{
if (i * j == x) //check if the number has multiples;
{
cout<<i<<" , "; //output provided for the reader to see the
// muliples
++counter; //counts the number of factors
}
}
}
cout<<"\n\n";
if(counter>2)
{
cout<<"value is not a prime number"<<"\n\n";
}
if(counter<=2)
{
cout<<"value is a prime number"<<endl;
}
}
答案 18 :(得分:0)
bool isPrime(int n)
{
if(n==1) return false;
if(n==2 || n==3) return true;
if(n%2==0 || n%3==0) return false;
for(int i=5;i*i<=n;i=i+6)
if(n%i==0 || n%(i+2)==0)
return false;
return true;
}
答案 19 :(得分:-1)
#define TRUE 1
#define FALSE -1
int main()
{
/* Local variables declaration */
int num = 0;
int result = 0;
/* Getting number from user for which max prime quadruplet value is
to be found */
printf("\nEnter the number :");
scanf("%d", &num);
result = Is_Prime( num );
/* Printing the result to standard output */
if (TRUE == result)
printf("\n%d is a prime number\n", num);
else
printf("\n%d is not a prime number\n", num);
return 0;
}
int Is_Prime( int num )
{
int i = 0;
/* Checking whether number is negative. If num is negative, making
it positive */
if( 0 > num )
num = -num;
/* Checking whether number is less than 2 */
if( 2 > num )
return FALSE;
/* Checking if number is 2 */
if( 2 == num )
return TRUE;
/* Checking whether number is even. Even numbers
are not prime numbers */
if( 0 == ( num % 2 ))
return FALSE;
/* Checking whether the number is divisible by a smaller number
1 += 2, is done to skip checking divisibility by even numbers.
Iteration reduced to half */
for( i = 3; i < num; i += 2 )
if( 0 == ( num % i ))
/* Number is divisible by some smaller number,
hence not a prime number */
return FALSE;
return TRUE;
}
答案 20 :(得分:-3)
if(number%2!=0)
cout<<"Number is prime:"<<endl;
代码非常错误。 33除以2是16,提醒1但它不是素数...