找到好的号码 - 在线代码挑战

时间:2015-08-09 16:33:23

标签: algorithm

给定范围:[a,b],找到此范围内的所有好数字。良好数字的定义是该数字的素数因子也是素数。

例如: 输入:范围[1 10] 好数:6,10

我只能提出一个简单的解决方案来检查范围内的每个元素。还有更好的吗?

1 个答案:

答案 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
    }
}