我被分配编写一个程序,检查一个数字是否为完美质数(其数字之和为质数,其数字之和为质数...)。我偶然发现了两个极端的案例,这些案例破坏了我的程序:
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;
}
对于这两个值,我看不到该脚本在哪里失败,对于较小的数字,为什么它也不会失败。
答案 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));
}
感谢您的回答。