#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
及以内的数所有位中出现的素数个数。