Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 1에서 N까지 거의 소수의 수 찾기

<시간/>

숫자 N이 있다고 가정합니다. 1에서 N까지의 범위에서 거의 소수를 찾아야 합니다. 숫자는 정확히 두 개의 서로 다른 인수를 가질 때 거의 소수라고 합니다. 숫자는 비소인수에 제한이 없지만 2개의 소인수여야 합니다. 따라서 N이 2이면 출력은 2가 됩니다. 두 개의 숫자 6과 10이 있습니다.

여기서 우리는 에라토스테네스의 체 접근법을 사용할 것입니다. 더 나은 아이디어를 얻으려면 다음 구현을 확인하십시오.

예시

#include<iostream>
#define N 100005
using namespace std;
bool prime[N];
void SieveOfEratosthenes() {
   for(int i = 0; i<N; i++)
   prime[i] = true;
   prime[1] = false;
   for (int i = 2; i * i < N; i++) {
      if (prime[i] == true) {
         for (int j = i * 2; j < N; j += i)
            prime[j] = false;
      }
   }
}
int countAlmostPrime(int n) {
   int result = 0;
   for (int i = 6; i <= n; i++) {
      int div_count = 0;
      for (int j = 2; j * j <= i; j++) {
         if (i % j == 0) {
            if (j * j == i) {
               if (prime[j])
                  div_count++;
            }else {
               if (prime[j])
                  div_count++;
               if (prime[i / j])
                  div_count++;
            }
         }
      }
      if (div_count == 2)
         result++;
   }
   return result;
}
int main() {
   SieveOfEratosthenes();
   int n = 21;
   cout << "Number of almost primes in range 1 to "<<n << " is: " << countAlmostPrime(n);
}

출력

Number of almost primes in range 1 to 21 is: 8