Find prime groups after dividing the range 1 to N into K equal sections
Last Updated :
24 Apr, 2023
Given a positive integer N and an integer K, The task is to find all prime numbers in the range of 1 to N that can be divided into K equal sections
Example:
Input: N = 20, K = 4
Output: 2, 3, 5, 7, 11, 13, 17, 19
Input: N = 30, K = 5
Output: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29
Approach: Sieve of Eratosthenes
The Sieve of Eratosthenes is an ancient algorithm for finding all prime numbers up to any given limit. It works by iterating over all numbers from 2 up to a given number N and marking all its multiples as composite (not prime).
Follow the below steps for the above approach:
- Create a vector sieve of size N+1 and mark it as true to store all prime numbers.
- Then, set number 0 and 1 as not prime number.
- Start marking all multiples of members as non-prime.
- Take the next number in the list that is not marked as composite and mark its multiples in the list as composite.
- Create a vector to store all prime numbers in a range of 1 to N.
- Then, Divide the prime numbers into k equal sections.
- Add all prime numbers in each sections.
Below is the implementation of the above approach:
C++
#include <iostream>
#include <vector>
using namespace std;
vector< int > primeNumberDivision( int N, int K)
{
vector< bool > sieve(N + 1, true );
sieve[0] = sieve[1] = false ;
for ( int i = 2; i * i <= N; i++) {
if (sieve[i] == true ) {
for ( int j = i * i; j <= N; j += i) {
sieve[j] = false ;
}
}
}
vector< int > prime;
for ( int i = 2; i <= N; i++) {
if (sieve[i] == true ) {
prime.push_back(i);
}
}
vector< int > ans;
int size = prime.size();
if (size % K != 0) {
return ans;
}
int step = size / K;
int start = 0;
int end = step;
while (start < size) {
for ( int i = start; i < end; i++) {
ans.push_back(prime[i]);
}
start = end;
end += step;
}
return ans;
}
void printAns(vector< int >& ans)
{
for ( auto a : ans) {
cout << a << " " ;
}
cout << endl;
}
int main()
{
int N = 20;
int K = 4;
vector< int > ans = primeNumberDivision(N, K);
printAns(ans);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static List<Integer> primeNumberDivision( int N, int K)
{
boolean [] sieve = new boolean [N + 1 ];
for ( int i = 0 ; i < sieve.length; i++) {
sieve[i] = true ;
}
sieve[ 0 ] = sieve[ 1 ] = false ;
for ( int i = 2 ; i * i <= N; i++) {
if (sieve[i]) {
for ( int j = i * i; j <= N; j += i) {
sieve[j] = false ;
}
}
}
List<Integer> prime = new ArrayList<>();
for ( int i = 2 ; i <= N; i++) {
if (sieve[i]) {
prime.add(i);
}
}
List<Integer> ans = new ArrayList<>();
int size = prime.size();
if (size % K != 0 ) {
return ans;
}
int step = size / K;
int start = 0 ;
int end = step;
while (start < size) {
for ( int i = start; i < end; i++) {
ans.add(prime.get(i));
}
start = end;
end += step;
}
return ans;
}
static void printAns(List<Integer> ans)
{
for ( int a : ans) {
System.out.print(a + " " );
}
System.out.println();
}
public static void main(String[] args)
{
int N = 20 ;
int K = 4 ;
List<Integer> ans = primeNumberDivision(N, K);
printAns(ans);
}
}
|
Python3
from typing import List
def primeNumberDivision(N: int , K: int ) - > List [ int ]:
sieve = [ True ] * (N + 1 )
sieve[ 0 ] = sieve[ 1 ] = False
for i in range ( 2 , int (N * * 0.5 ) + 1 ):
if sieve[i] = = True :
for j in range (i * i, N + 1 , i):
sieve[j] = False
prime = []
for i in range ( 2 , N + 1 ):
if sieve[i] = = True :
prime.append(i)
ans = []
size = len (prime)
if size % K ! = 0 :
return ans
step = size / / K
start = 0
end = step
while start < size:
for i in range (start, end):
ans.append(prime[i])
start = end
end + = step
return ans
def printAns(ans: List [ int ]) - > None :
for a in ans:
print (a, end = ' ' )
print ()
def main():
N = 20
K = 4
ans = primeNumberDivision(N, K)
printAns(ans)
if __name__ = = '__main__' :
main()
|
C#
using System;
using System.Collections.Generic;
public class GFG {
static List< int > primeNumberDivision( int N, int K)
{
bool [] sieve = new bool [N + 1];
for ( int i = 0; i < sieve.Length; i++) {
sieve[i] = true ;
}
sieve[0] = sieve[1] = false ;
for ( int i = 2; i * i <= N; i++) {
if (sieve[i]) {
for ( int j = i * i; j <= N; j += i) {
sieve[j] = false ;
}
}
}
List< int > prime = new List< int >();
for ( int i = 2; i <= N; i++) {
if (sieve[i]) {
prime.Add(i);
}
}
List< int > ans = new List< int >();
int size = prime.Count;
if (size % K != 0) {
return ans;
}
int step = size / K;
int start = 0;
int end = step;
while (start < size) {
for ( int i = start; i < end; i++) {
ans.Add(prime[i]);
}
start = end;
end += step;
}
return ans;
}
static void printAns(List< int > ans)
{
foreach ( int a in ans) { Console.Write(a + " " ); }
Console.WriteLine();
}
static public void Main()
{
int N = 20;
int K = 4;
List< int > ans = primeNumberDivision(N, K);
printAns(ans);
}
}
|
Javascript
function primeNumberDivision(N, K) {
let sieve = new Array(N + 1).fill( true );
sieve[0] = sieve[1] = false ;
for (let i = 2; i * i <= N; i++) {
if (sieve[i] == true ) {
for (let j = i * i; j <= N; j += i) {
sieve[j] = false ;
}
}
}
let prime = [];
for (let i = 2; i <= N; i++) {
if (sieve[i] == true ) {
prime.push(i);
}
}
let ans = [];
let size = prime.length;
if (size % K != 0) {
return ans;
}
let step = size / K;
let start = 0;
let end = step;
while (start < size) {
for (let i = start; i < end; i++) {
ans.push(prime[i]);
}
start = end;
end += step;
}
return ans;
}
function printAns(ans)
{
for (let a of ans) {
console.log(a + " " );
}
console.log( "<br>" )
}
let N = 20;
let K = 4;
let ans = primeNumberDivision(N, K);
printAns(ans);
|
Output
2 3 5 7 11 13 17 19
Complexity Analysis:
Time Complexity: N*log(log(N))
Space Complexity: O(N).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...