【问题描述】试定义一个类NUM,求100以内所有的无暇素数。所谓无暇素数是指其本身是素数,其逆序数也是素数。例如,3为素数,且它的逆序数是它本身,所以3是无暇素数;17是素数,17的逆序数是71,17和71都是素数,所以17和71都是无暇素数。具体要求如下:
(1) 私有数据成员
int a[20]; 整型数组,用来存储100以内的无暇素数。
int count; 整型变量,记录找到的无暇素数的个数。
(2) 公有成员函数
NUM(); 构造函数,将count初始化为0。
int reverse( int n); 求取并返回n的逆序数。
int isPrime(int n); 判断n是否为素数,若是素数返回1,否则返回0。
void fun(); 求100以内的所有无暇素数并存储在数组a中。
void print(); 输出100以内的无暇素数的总个数和每个无暇素数。
(3) 在主函数中对NUM类进行测试。
【输入形式】无
【输出形式】输出100以内的无暇素数的个数和大小。
【样例输入】
【样例输出】
count=13
2 3 5 7 11 13 17 31 37 71 73 79 97
#include <iostream>
using namespace std;
class NUM {
private:
int a[20]; // 存储无暇素数
int count; // 无暇素数个数
public:
NUM() { count = 0; } // 构造函数,初始化count为0
int reverse(int n); // 求逆序数
int isPrime(int n); // 判断素数
void fun(); // 求无暇素数
void print(); // 输出无暇素数
};
//逆序
int NUM::reverse(int n) {
int res = 0;
while (n) {
res = res * 10 + n % 10;
n /= 10;
}
return res;
}
//判断素数
int NUM::isPrime(int n) {
if (n <= 1) return 0;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return 0;
}
return 1;
}
//输出素数
void NUM::fun() {
for (int i = 2; i < 100; i++) {
if (isPrime(i) && isPrime(reverse(i))) {
a[count++] = i;
}
}
}
//打印素数
void NUM::print() {
cout << "count=" << count << endl;
for (int i = 0; i < count; i++) {
cout << a[i] << " ";
}
cout << endl;
}
int main() {
NUM num;
num.fun();
num.print();
return 0;
}