Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;检查素数不起作用的代码 我对C++代码有问题。整数num是一个我想检查它是否为素数的数字。然而,这个程序总是返回false。可能很简单,但我什么也找不到 for(int i=2;i<num;i++){ //primes are allowed to be divided by 1 so we start at 2 if(num % i == 0){ //can be divided by a number other than itself or 1 so we trip out return false; } else if(i == num){ //if we've already done checks as high as possible and not tripped out yet then report success return true; } } for(int i=2;i_C++_Primes - Fatal编程技术网

C++;检查素数不起作用的代码 我对C++代码有问题。整数num是一个我想检查它是否为素数的数字。然而,这个程序总是返回false。可能很简单,但我什么也找不到 for(int i=2;i<num;i++){ //primes are allowed to be divided by 1 so we start at 2 if(num % i == 0){ //can be divided by a number other than itself or 1 so we trip out return false; } else if(i == num){ //if we've already done checks as high as possible and not tripped out yet then report success return true; } } for(int i=2;i

C++;检查素数不起作用的代码 我对C++代码有问题。整数num是一个我想检查它是否为素数的数字。然而,这个程序总是返回false。可能很简单,但我什么也找不到 for(int i=2;i<num;i++){ //primes are allowed to be divided by 1 so we start at 2 if(num % i == 0){ //can be divided by a number other than itself or 1 so we trip out return false; } else if(i == num){ //if we've already done checks as high as possible and not tripped out yet then report success return true; } } for(int i=2;i,c++,primes,C++,Primes,i==num将永远不会发生,因为循环条件是i,您不必检查每个数字,因为它们中的许多数字很容易被排除。例如,在检查num不可被2整除后,您可以跳过所有其他偶数。这样可以节省一半的测试 我们还明确地知道,任何其他因素必须小于num/2(或者实际上sqrt(num),但这更难计算)。这些知识可以为我们节省另一半的测试 现在我们有: if (num % 2 == 0) return false; for(int i = 3; i < num / 2; i += 2){ if(

i==num
将永远不会发生,因为循环条件是
i,您不必检查每个数字,因为它们中的许多数字很容易被排除。例如,在检查
num
不可被
2
整除后,您可以跳过所有其他偶数。这样可以节省一半的测试

我们还明确地知道,任何其他因素必须小于
num/2
(或者实际上
sqrt(num)
,但这更难计算)。这些知识可以为我们节省另一半的测试

现在我们有:

if (num % 2 == 0)
    return false;

for(int i = 3; i < num / 2; i += 2){ 
     if(num % i == 0){ //can be divided by a number other than itself or 1 so we trip out
         return false;
     }
}

// arriving here we have found no factors, so it must be a prime
return true;
if(num%2==0)
返回false;
对于(inti=3;i
bool CheckPrime(int num){
bool-yayornay=正确;
for(int i=2;i
以下是正确的方式来表达你的意思:

int i=2;                     // move declaration out
for(/*int i=2*/;i<num;i++){ 
        if(num % i == 0){ 
            return false;
        } // else            // and the final test too
}
if(i == num){                
    return true;
}

(注意:这比这里的另一个答案更有效,它表示这是对该答案初始版本的“优化”。

对Will Ness代码的一个小优化,只需计算for之外的数字的sqrt。条件检查执行多次,每次计算sqrt都没有意义

if( num == 2 ) return true;
if( num < 2 || num % 2 == 0 ) return false;
int sqrt = sqrt(num);

for( int i=3; i<=sqrt; i+=2 ){   
        if(num % i == 0){ 
            return false;
        } 
}
return true;
if(num==2)返回true;
如果(num<2 | | num%2==0)返回false;
int sqrt=sqrt(num);
对于(int i=3;i
bool isprime(int n)
{

如果(nN)(i==2;iI)甚至会建议(i==2;i*icorrect max是const int maxvalue=static_cast(sqrt(num)),那么每个人似乎都在用多次返回、中断等不必要地使事情复杂化。为什么不简单地说:
int limit=sqrt(num);int i=3;而(i@Axel我看不到更多的代码,也看不到更多的条件。对于复杂性,有几种既定的衡量标准。(如果你按照我的建议去做,会有更多的代码:先检查偶数,然后从3开始迭代2步。但这是一种你无论如何都可能想做的优化。)(或者真的
sqrt(num)
,但这更难计算)但是你有这句话的代码。.-]既然你提到过,从srqt->num/2开始,计算sqrt真的会过多吗?因为计算sqrt很昂贵,我们停在sqrt不会有任何好处吗?我只是在这里摘一些挂不住的果实,减少75%的运行时间。我们做的任何其他事情显然都会影响re维护25%是否值得付出额外的努力?这要看情况而定。@MohanKumar除非
num
非常小,
sqrt(num)
将显著小于
num/2
,这意味着通过循环的次数要少得多。在现代机器上,
sqrt(num)
也不应该太贵。在计算
num%i
时,某些硬件,如x86,也会作为副产品提供
num/i
。我们可以将其用作不断缩小的上限。没有
break
?效率太低。@JeffSchweigler,如果没有大括号,您的代码就会中断。@第一次迭代。编辑以更正相同的错误。您是说第四行吗?我故意省略括号,将第五行内联,这样它就不需要它们了。=)将多个语句放在同一行并不会以某种方式将它们组合在一起。@Mohan是对的。我假设编译器将执行该优化。:)顺便说一句,我已经对代码进行了编辑,我认为这应该会使它快30%。你的解决方案与@ZelterAdy的解决方案非常相似。但是,他的算法比你的算法更有效。那么,你为什么发布另一个不提供任何附加值的解决方案呢?
int i=2;                     // move declaration out
for(/*int i=2*/;i<num;i++){ 
        if(num % i == 0){ 
            return false;
        } // else            // and the final test too
}
if(i == num){                
    return true;
}
if( num == 2 || num == 3 ) return true;
if( num < 2 || num % 2 == 0 || num % 3 == 0 ) return false;
for( int i=5, j=7, lim=sqrt(num); i<=lim; i+=6, j+=6 ){   
        if( num % i == 0 || num % j == 0 ){ 
            return false;
        } 
}
return true;
if( num == 2 ) return true;
if( num < 2 || num % 2 == 0 ) return false;
int sqrt = sqrt(num);

for( int i=3; i<=sqrt; i+=2 ){   
        if(num % i == 0){ 
            return false;
        } 
}
return true;
bool isprime(int n)
{
    if(n<2) return false;
    if(n==2)return true;
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0) return false;
    return true;
}