找素数

发布时间 2023-11-25 10:38:14作者: 卡布叻-空白
#include <iostream>

using namespace std;

// 判断一个数是否是素数
bool isPrime(int num) {
    if (num < 2) {
        return false;  // 数字小于2不是素数
    }

    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            return false;  // 数字有除了1和它本身以外的因子,不是素数
        }
    }

    return true;  // 没有除了1和它本身以外的因子,是素数
}

// 统计一个数的各个位上是素数的个数
int countPrimeDigits(int num) {
    int count = 0;

    while (num > 0) {
        int digit = num % 10;  // 取出个位上的数字
        if (isPrime(digit)) {
            count++;  // 个位上的数字是素数,计数加一
        }
        num /= 10;  // 去掉个位上的数字
    }

    return count;
}

int main() {
    int T;
    cin >> T;

    while (T--) {
        int n;
        cin >> n;

        int totalPrimeDigits = 0;

        for (int i = 1; i <= n; i++) {
            totalPrimeDigits += countPrimeDigits(i);  // 统计每个数的各位上是素数的个数,并累加到总数中
        }

        cout << totalPrimeDigits << endl;
    }

    return 0;
}

首先,我们定义了一个函数 isPrime,用于判断一个数是否是素数。如果一个数小于2,那么它不是素数。否则,我们从2开始遍历到该数的平方根,如果存在能整除该数的因子,那么它不是素数,返回 false;否则,它是素数,返回 true

接下来,我们定义了一个函数 countPrimeDigits,用于统计一个数的各个位上是素数的个数。我们通过不断取余和整除操作,可以依次取出该数的个位、十位、百位等数字。对于每个位上的数字,我们调用 isPrime 函数判断是否是素数,如果是素数,计数器加一。最后,返回计数器的值。

main 函数中,我们首先读取整数 T,表示有 T 组测试数据。然后,使用 while 循环处理每组数据。

在每组数据中,我们读取一个整数 n,表示数位分离 n 及以内的数。我们定义一个变量 totalPrimeDigits 用于记录分离 n 及以内的数所有位中出现的素数个数,初始值为0。

接下来,我们使用一个循环从1到 n 遍历每个数,对于每个数,调用 countPrimeDigits 函数统计各位上是素数的个数,并累加到 totalPrimeDigits 中。

最后,输出 totalPrimeDigits,即分离 n 及以内的数所有位中出现的素数个数。