C++ 需要让这个程序检查数字是否为素数,但没有if语句,如何使它为1工作?无法更改主目录

C++ 需要让这个程序检查数字是否为素数,但没有if语句,如何使它为1工作?无法更改主目录,c++,c++11,c++14,C++,C++11,C++14,需要让这个程序检查数字是否为素数,但没有if语句,如何使它为1工作?无法更改主目录 #include <iostream> bool prime(int x){ for (int i = 2; i < x; ++i){ return (x % i != 0); } } int main() { std::cout << std::boolalpha << prime(1344) << std::e

需要让这个程序检查数字是否为素数,但没有if语句,如何使它为1工作?无法更改主目录

#include <iostream>

bool prime(int x){

    for (int i = 2; i < x; ++i){
        return (x % i != 0);
    }
}

int main() {
    std::cout << std::boolalpha << prime(1344) << std::endl;
}

函数在循环的第一次迭代中返回,并且只检查数字是偶数还是奇数。其基本上与:

bool prime(int x){    
    return (x % 2 != 0);
}
对于x==1的特殊情况,您只需要添加一个条件,即x只有在不是1时才可以是素数。我们可以通过要求在循环条件中还没有找到一个因子来打破循环。也就是说:我们首先假设它为_prime=true,除非它为1,然后在我们知道它不是prime时停止:

bool prime(int x){
    bool is_prime = true and (x != 1);
    for (int i = 2; i < x and is_prime; ++i){
        is_prime = is_prime and (x % i != 0);
    }
    return is_prime;
}
请注意,您需要检查的最大因子实际上是sqrtx,因为如果x的除数大于sqrtx,那么它的除数也必须小于sqrtx

PS:不使用if是一个相当人为的要求。即使上面的解决方案没有if,它仍然有几个分支。如果您想要一个没有分支的解决方案,那么这不是它

bool prime(int x){
    int limit = sqrt(x);
    
    bool isPrime = 1^x; 
    for(int i=2; i <= limit; i++){
        isPrime &= (x % i != 0);
    }
    return isPrime;
}
bool isPrime=1^x对于1为假,对于所有其他数字为真


和x%i!=0对于所有素数始终为true,对于非素数至少为false

我建议打开编译器警告,并在调试器中单步执行此操作。这两个都应该是很有启发性的。您总是在第一次循环迭代时返回一个值。您的函数相当于返回x%2!=0。@Damien ups已修复,现在我明白了如何使其为1工作的含义;我可能会添加到循环条件中,以便在is_prime变为false时,它立即脱离循环。@Someprogrammerdude omg。我对答案的第一个想法是一些讨论for循环是if伪装的散文,但我很快放弃了这个想法。将编辑…可以简化一点:bool是_prime=x!=1.对于int i=2;i