이 문제에서는 숫자 n이 주어집니다. 우리의 임무는 모든 Pierpont 소수를 출력하는 것입니다. n보다 작습니다.
피어폰트 프라임 number는
형식의 특수 유형의 소수입니다.p=2 i . 3 k + 1.
여기서 p는 소수이고 i와 k는 일부 정수입니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력 - n =50
출력 - 2, 3, 5, 7, 13, 17, 19, 37
이 문제를 해결하려면 조건을 따르는 모든 소수를 찾아야 합니다. 이를 위해 우리는 2와 3의 거듭제곱을 가진 숫자를 찾을 것입니다. 그리고 모든 소수를 찾습니다. 그리고 조건 다음에 오는 소수인 두 숫자를 인쇄하십시오.
예시
솔루션 구현을 보여주는 프로그램,
#include <bits/stdc++.h> using namespace std; void printPierpontPrimes(int n){ bool arr[n+1]; memset(arr, false, sizeof arr); int two = 1, three = 1; while (two + 1 < n) { arr[two] = true; while (two * three + 1 < n) { arr[three] = true; arr[two * three] = true; three *= 3; } three = 1; two *= 2; } vector<int> primes; for (int i = 0; i < n; i++) if (arr[i]) primes.push_back(i + 1); memset(arr, false, sizeof arr); for (int p = 2; p * p < n; p++) { if (arr[p] == false) for (int i = p * 2; i< n; i += p) arr[i] = true; } for (int i = 0; i < primes.size(); i++) if (!arr[primes[i]]) cout<<primes[i]<<"\t"; } int main(){ int n = 50; cout<<"All Pierpont Prime Numbers less than "<<n<<" are :\n"; printPierpontPrimes(n); return 0; }
출력
All Pierpont Prime Numbers less than 50 are : 2 3 5 7 13 17 19 37