给定范围:[a,b],找到此范围内的所有好数字。良好数字的定义是该数字的素数因子也是素数。
例如: 输入:范围[1 10] 好数:6,10
我只能提出一个简单的解决方案来检查范围内的每个元素。还有更好的吗?
答案 0 :(得分:1)
您可以使用Sieve of Eratosthenes实施解决方案。如果一个数字是素数,它的所有倍数都会将其作为一个主要因素。这样,您可以计算范围[1 n]中每个数字的不同素数因子的数量。之后,只需检查数字因子的数量本身是否为素数。
const int N=100;
int factors[N]; // will store number of prime factors of each number in [1..n]
for(int i=2; i<=N; i++) {
if(factors[i]==0) { // we haven't found any factor of i yet so its prime
for(int j=i; j<=N; j+=i) {
factors[j]++;
}
}
}
int result=0;
for(int i=a; i<=b; i++) {
int numOfFactors=factors[i];
if(factors[numOfFactors]==1) {
result++; // count will have value 1 only if its a prime number
}
}