递归检查数字是否为素数

时间:2018-10-10 18:41:13

标签: c++ recursion boolean

我被分配编写一个程序,检查一个数字是否为完美质数(其数字之和为质数,其数字之和为质数...)。我偶然发现了两个极端的案例,这些案例破坏了我的程序:

INPUT: 20328307  OUTPUT: true (expected false)
INPUT: 587899597 OUTPUT: true (expected false)

代码:

#include <iostream>
using namespace std;


bool is_prime(int n) {
    if (n == 0 or n == 1) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    for (int i = 3; i * i == n; i += 2) {
        if (n % i == 0) return false;
    }
    return true;
}

int sum_of_digits(int n) {
    int sum = 0;
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

bool is_perfect_prime(int n) {
    if (sum_of_digits(n) >= 10) is_perfect_prime(sum_of_digits(n)); //cas recursiu
    return is_prime(n); //cas base

}

int main() {
    int n;
    while (cin >> n) cout << (is_perfect_prime(n) ? "true" : "false") << endl;
}

对于这两个值,我看不到该脚本在哪里失败,对于较小的数字,为什么它也不会失败。

2 个答案:

答案 0 :(得分:1)

首先,您的for循环不正确,应该改为:

 for (int i = 3; i * i <= n; i += 2) {
     if (n % i == 0) return false;
 }

否则,您几乎对每个非偶数都返回true。其次,您忽略递归调用的结果,可能的解决方案是:

bool is_perfect_prime(int n) {
    if ( n >= 10 and not is_perfect_prime(sum_of_digits(n)) )
        return false;
    return is_prime(n); //cas base
}

答案 1 :(得分:1)

最后,我可以使用它了。问题出在is_prime()for循环以及is_perfect_prime()的递归情况下。这是我想出的:

bool is_prime(int n) {
    if (n == 0 or n == 1) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0) return false;
    }
    return true;
}

int sum_of_digits(int n) {
    int sum = 0;
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

bool is_perfect_prime(int n) {
    if (n < 10) return is_prime(n);
    if (! is_prime(n)) return false;
    return is_perfect_prime(sum_of_digits(n));
}

感谢您的回答。