需要让这个程序检查 Number 是否为素数但没有 if 语句,如何使它对 1 起作用?主要不能改变

问题描述

需要让这个程序检查 Number 是否为素数但没有 if 语句,如何使它对 1 起作用? main 不能改变

#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 时只能是素数。我们可以通过要求我们尚未在循环条件中找到因子来跳出循环。也就是说:我们首先假设 is_prime = true 除非它是 1,一旦我们知道它不是质数就停止:

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;
}

请注意,您需要检查的最大因数实际上是 sqrt(x),因为如果 x 的除数大于 sqrt(x),那么它的除数也必须小于 {{1 }}。

PS:不使用 sqrt(x) 是一个相当人为的要求。即使上面的解决方案没有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) 对所有质数始终为真,对非质数至少有一个假