Count distinct prime factors for each element of an array - GeeksforGeeks (2024)

Last Updated : 02 Nov, 2023

Summarize

Comments

Improve

Given an array arr[] of size N, the task is to find the count of distinct prime factors of each element of the given array.

Examples:

Input: arr[] = {6, 9, 12}
Output: 2 1 2
Explanation:

  • 6 = 2 × 3. Therefore, count = 2
  • 9 = 3 × 3. Therefore, count = 1
  • 12 = 2 × 2 × 3. Therefore, count = 2

The count of distinct prime factors of each array element are 2, 1, 2 respectively.

Input: arr[] = {4, 8, 10, 6}
Output: 1 1 2 2

Naive Approach: The simplest approach to solve the problem is to find the distinct prime factors of each array element. Then, print that count for each array element.

steps to implement-

  • Run a loop over the given array to find the count of distinct prime factors of each element
  • For finding the count of distinct prime factors of each element-
    • Initialize a variable count with a value of 0
    • First, check if the number can be divided by 2. If it can be then divide it by 2 till it can be divided and after that increment the count by 1.
    • Then check for all odd numbers from 3 till its square root that it can divide the number or not
    • If any odd number can divide then it should divide till it can and after that increment count by 1 for each odd number
    • In last, if still we have number>2 then this number that is remaining is any prime number so increment count by 1
    • In the last print/return the count

Code-

C++

// C++ program for the above approach

#include <bits/stdc++.h>

using namespace std;

// A function to provide count of

//distinct prime factor of a given number

int primeFactors(int n)

{

//To store count of distinct prime factor of given number

int count=0;

//Boolean variable to check an element

//is included in its prime factor or not

bool val=false;

// Remove all 2s that can be prime factor of n

while (n % 2 == 0)

{

val=true;

n = n/2;

}

//If 2 is included

if(val==true){count++;}

// n must be odd at this point. So we can skip

// one element (Note i = i +2)

for (int i = 3; i <= sqrt(n); i = i + 2)

{

//To check whether i is included in prime factor

val=false;

// While i divides n,divide n

while (n % i == 0)

{

val=true;

n = n/i;

}

//If i is included in prime factor

if(val==true){count++;}

}

// This condition is to handle the case when n

// is a prime number greater than 2

if (n > 2){

count++;

}

return count;

}

// Function to get the distinct

// factor count of arr[]

void getFactorCount(int arr[],

int N)

{

//Traverse every array element

for(int i=0;i<N;i++){

cout<<primeFactors(arr[i])<<" ";

}

}

// Driver Code

int main()

{

int arr[] = { 6, 9, 12 };

int N = sizeof(arr) / sizeof(arr[0]);

getFactorCount(arr, N);

return 0;

}

Java

import java.util.*;

public class Main {

// A function to provide count of

// distinct prime factors of a given number

static int primeFactors(int n) {

// To store the count of distinct prime factors of the given number

int count = 0;

// Boolean variable to check if an element is included in its prime factor or not

boolean val = false;

// Remove all 2s that can be prime factors of n

while (n % 2 == 0) {

val = true;

n = n / 2;

}

// If 2 is included

if (val) {

count++;

}

// n must be odd at this point. So we can skip one element (Note i = i + 2)

for (int i = 3; i <= Math.sqrt(n); i = i + 2) {

// To check whether i is included in prime factor

val = false;

// While i divides n, divide n

while (n % i == 0) {

val = true;

n = n / i;

}

// If i is included in the prime factor

if (val) {

count++;

}

}

// This condition is to handle the case when n is a prime number greater than 2

if (n > 2) {

count++;

}

return count;

}

// Function to get the distinct factor count of arr[]

static void getFactorCount(int[] arr, int N) {

// Traverse every array element

for (int i = 0; i < N; i++) {

System.out.print(primeFactors(arr[i]) + " ");

}

}

public static void main(String[] args) {

int[] arr = { 6, 9, 12 };

int N = arr.length;

getFactorCount(arr, N);

}

}

Python3

import math

# A function to provide count of distinct prime factor of a given number

def prime_factors(n):

# To store count of distinct prime factors of the given number

count = 0

# Boolean variable to check if an element is included in its prime factors or not

val = False

# Remove all 2s that can be prime factors of n

while n % 2 == 0:

val = True

n = n // 2

# If 2 is included

if val == True:

count += 1

# n must be odd at this point. So we can skip one element (Note i = i + 2)

for i in range(3, int(math.sqrt(n)) + 1, 2):

# To check whether i is included in prime factors

val = False

# While i divides n, divide n

while n % i == 0:

val = True

n = n // i

# If i is included in prime factors

if val == True:

count += 1

# This condition is to handle the case when n is a prime number greater than 2

if n > 2:

count += 1

return count

# Function to get the distinct factor count of arr[]

def get_factor_count(arr):

# Traverse every array element

for num in arr:

print(prime_factors(num), end=" ")

# Driver Code

if __name__ == "__main__":

arr = [6, 9, 12]

get_factor_count(arr)

C#

using System;

class Program

{

// A function to provide the count of distinct prime factors of a given number

static int PrimeFactors(int n)

{

// To store the count of distinct prime factors of the given number

int count = 0;

// Boolean variable to check if an element is included in its prime factors or not

bool val = false;

// Remove all 2s that can be prime factors of n

while (n % 2 == 0)

{

val = true;

n = n / 2;

}

// If 2 is included

if (val)

{

count++;

}

// n must be odd at this point, so we can skip one element (Note i = i + 2)

for (int i = 3; i <= Math.Sqrt(n); i += 2)

{

// To check whether i is included in prime factors

val = false;

// While i divides n, divide n

while (n % i == 0)

{

val = true;

n = n / i;

}

// If i is included in prime factors

if (val)

{

count++;

}

}

// This condition is to handle the case when n is a prime number greater than 2

if (n > 2)

{

count++;

}

return count;

}

// Function to get the distinct factor count of an array

static void GetFactorCount(int[] arr)

{

// Traverse every array element

foreach (int num in arr)

{

Console.Write(PrimeFactors(num) + " ");

}

}

static void Main()

{

int[] arr = { 6, 9, 12 };

GetFactorCount(arr);

}

}

Javascript

// JavaScript program for the above approach

// A function to provide count of

//distinct prime factor of a given number

function primeFactors(n)

{

//To store count of distinct prime factor of given number

let count=0;

//Boolean variable to check an element

//is included in its prime factor or not

let val=false;

// Remove all 2s that can be prime factor of n

while (n % 2 == 0)

{

val=true;

n = n/2;

}

//If 2 is included

if(val==true){count++;}

// n must be odd at this point. So we can skip

// one element (Note i = i +2)

for (let i = 3; i <= Math.sqrt(n); i = i + 2)

{

//To check whether i is included in prime factor

val=false;

// While i divides n,divide n

while (n % i == 0)

{

val=true;

n = n/i;

}

//If i is included in prime factor

if(val==true){count++;}

}

// This condition is to handle the case when n

// is a prime number greater than 2

if (n > 2){

count++;

}

return count;

}

// Function to get the distinct

// factor count of arr[]

function getFactorCount(arr, N)

{

//Traverse every array element

for(let i=0;i<N;i++){

document.write(primeFactors(arr[i])+ " ");

}

}

// Driver Code

let arr = [ 6, 9, 12 ];

let N = arr.length;

getFactorCount(arr, N);

Output-

2 1 2 

Time Complexity: O(N * (√Maximum value present in array)), because O(N) in traversing the array and (√Maximum value present in array) is the maximum time to find the count of distinct prime factors of each Number
Auxiliary Space: O(1), because no extra space has been used

Efficient Approach: The above approach can be optimized by precomputing the distinct factors of all the numbers using their Smallest Prime Factors. Follow the steps below to solve the problem

  • Initialize a vector, say v, to store the distinct prime factors.
  • Store the Smallest Prime Factor(SPF) up to 105 using a Sieve of Eratosthenes.
  • Calculate the distinct prime factors of all the numbers by dividing the numbers recursively with their smallest prime factor till it reduces to 1 and store distinct prime factors of X, in v[X].
  • Traverse the array arr[] and for each array element, print the count as v[arr[i]].size().

Below is the implementation of the above approach :

C++14

// C++ program for the above approach

#include <bits/stdc++.h>

using namespace std;

#define MAX 100001

// Stores smallest prime

// factor for every number

int spf[MAX];

// Stores distinct prime factors

vector<int> v[MAX];

// Function to find the smallest

// prime factor of every number

void sieve()

{

// Mark the smallest prime factor

// of every number to itself

for (int i = 1; i < MAX; i++)

spf[i] = i;

// Separately mark all the

// smallest prime factor of

// every even number to be 2

for (int i = 4; i < MAX; i = i + 2)

spf[i] = 2;

for (int i = 3; i * i < MAX; i++)

// If i is prime

if (spf[i] == i) {

// Mark spf for all numbers

// divisible by i

for (int j = i * i; j < MAX;

j = j + i) {

// Mark spf[j] if it is

// not previously marked

if (spf[j] == j)

spf[j] = i;

}

}

}

// Function to find the distinct

// prime factors

void DistPrime()

{

for (int i = 1; i < MAX; i++) {

int idx = 1;

int x = i;

// Push all distinct of x

// prime factor in v[x]

if (x != 1)

v[i].push_back(spf[x]);

x = x / spf[x];

while (x != 1) {

if (v[i][idx - 1]

!= spf[x]) {

// Pushback into v[i]

v[i].push_back(spf[x]);

// Increment the idx

idx += 1;

}

// Update x = (x / spf[x])

x = x / spf[x];

}

}

}

// Function to get the distinct

// factor count of arr[]

void getFactorCount(int arr[],

int N)

{

// Precompute the smallest

// Prime Factors

sieve();

// For distinct prime factors

// Fill the v[] vector

DistPrime();

// Count of Distinct Prime

// Factors of each array element

for (int i = 0; i < N; i++) {

cout << (int)v[arr[i]].size()

<< " ";

}

}

// Driver Code

int main()

{

int arr[] = { 6, 9, 12 };

int N = sizeof(arr) / sizeof(arr[0]);

getFactorCount(arr, N);

return 0;

}

Java

// Java program for the above approach

import java.io.*;

import java.lang.*;

import java.util.*;

class GFG

{

static int MAX = 100001;

// Stores smallest prime

// factor for every number

static int spf[];

// Stores distinct prime factors

static ArrayList<Integer> v[];

// Function to find the smallest

// prime factor of every number

static void sieve()

{

// Mark the smallest prime factor

// of every number to itself

for (int i = 1; i < MAX; i++)

spf[i] = i;

// Separately mark all the

// smallest prime factor of

// every even number to be 2

for (int i = 4; i < MAX; i = i + 2)

spf[i] = 2;

for (int i = 3; i * i < MAX; i++)

// If i is prime

if (spf[i] == i) {

// Mark spf for all numbers

// divisible by i

for (int j = i * i; j < MAX; j = j + i) {

// Mark spf[j] if it is

// not previously marked

if (spf[j] == j)

spf[j] = i;

}

}

}

// Function to find the distinct

// prime factors

static void DistPrime()

{

for (int i = 1; i < MAX; i++) {

int idx = 1;

int x = i;

// Push all distinct of x

// prime factor in v[x]

if (x != 1)

v[i].add(spf[x]);

x = x / spf[x];

while (x != 1) {

if (v[i].get(idx - 1) != spf[x]) {

// Pushback into v[i]

v[i].add(spf[x]);

// Increment the idx

idx += 1;

}

// Update x = (x / spf[x])

x = x / spf[x];

}

}

}

// Function to get the distinct

// factor count of arr[]

static void getFactorCount(int arr[], int N)

{

// initialization

spf = new int[MAX];

v = new ArrayList[MAX];

for (int i = 0; i < MAX; i++)

v[i] = new ArrayList<>();

// Precompute the smallest

// Prime Factors

sieve();

// For distinct prime factors

// Fill the v[] vector

DistPrime();

// Count of Distinct Prime

// Factors of each array element

for (int i = 0; i < N; i++) {

System.out.print((int)v[arr[i]].size() + " ");

}

}

// Driver Code

public static void main(String[] args)

{

int arr[] = { 6, 9, 12 };

int N = arr.length;

getFactorCount(arr, N);

}

}

// This code is contributed by Kingash.

Python3

MAX = 100001

# Stores smallest prime

# factor for every number

spf = [0] * MAX

# Stores distinct prime factors

v = [[] for _ in range(MAX)]

# Function to find the smallest

# prime factor of every number

def sieve():

# Mark the smallest prime factor

# of every number to itself

for i in range(1, MAX):

spf[i] = i

# Separately mark all the

# smallest prime factor of

# every even number to be 2

for i in range(4, MAX, 2):

spf[i] = 2

for i in range(3, int(MAX**0.5)+1):

# If i is prime

if spf[i] == i:

# Mark spf for all numbers

# divisible by i

for j in range(i*i, MAX, i):

# Mark spf[j] if it is

# not previously marked

if spf[j] == j:

spf[j] = i

# Function to find the distinct

# prime factors

def DistPrime():

for i in range(1, MAX):

idx = 1

x = i

# Push all distinct of x

# prime factor in v[x]

if x != 1:

v[i].append(spf[x])

x = x // spf[x]

while x != 1:

if v[i][idx-1] != spf[x]:

# Pushback into v[i]

v[i].append(spf[x])

# Increment the idx

idx += 1

# Update x = (x / spf[x])

x = x // spf[x]

# Function to get the distinct

# factor count of arr[]

def getFactorCount(arr, N):

# Precompute the smallest

# Prime Factors

sieve()

# For distinct prime factors

# Fill the v[] vector

DistPrime()

# Count of Distinct Prime

# Factors of each array element

for i in range(N):

print(len(v[arr[i]]), end=' ')

arr = [6, 9, 12]

N = len(arr)

getFactorCount(arr, N)

# This code is contributed by phasing17.

C#

// C# program for the above approach

using System;

using System.Collections.Generic;

class GFG

{

static int MAX = 100001;

// Stores smallest prime

// factor for every number

static int[] spf;

// Stores distinct prime factors

static List<List<int>> v;

// Function to find the smallest

// prime factor of every number

static void sieve()

{

// Mark the smallest prime factor

// of every number to itself

for (int i = 1; i < MAX; i++)

spf[i] = i;

// Separately mark all the

// smallest prime factor of

// every even number to be 2

for (int i = 4; i < MAX; i = i + 2)

spf[i] = 2;

for (int i = 3; i * i < MAX; i++)

// If i is prime

if (spf[i] == i) {

// Mark spf for all numbers

// divisible by i

for (int j = i * i; j < MAX; j = j + i) {

// Mark spf[j] if it is

// not previously marked

if (spf[j] == j)

spf[j] = i;

}

}

}

// Function to find the distinct

// prime factors

static void DistPrime()

{

for (int i = 1; i < MAX; i++) {

int idx = 1;

int x = i;

// Push all distinct of x

// prime factor in v[x]

if (x != 1)

v[i].Add(spf[x]);

x = x / spf[x];

while (x != 1) {

if (v[i][idx - 1] != spf[x]) {

// Pushback into v[i]

v[i].Add(spf[x]);

// Increment the idx

idx += 1;

}

// Update x = (x / spf[x])

x = x / spf[x];

}

}

}

// Function to get the distinct

// factor count of arr[]

static void getFactorCount(int[] arr, int N)

{

// initialization

spf = new int[MAX];

v = new List<List<int>>() ;

for (int i = 0; i < MAX; i++)

v.Add(new List<int>());

// Precompute the smallest

// Prime Factors

sieve();

// For distinct prime factors

// Fill the v[] vector

DistPrime();

// Count of Distinct Prime

// Factors of each array element

for (int i = 0; i < N; i++) {

Console.Write((int)v[arr[i]].Count + " ");

}

}

// Driver Code

public static void Main(string[] args)

{

int[] arr = { 6, 9, 12 };

int N = arr.Length;

getFactorCount(arr, N);

}

}

// This code is contributed by phasing17.

Javascript

<script>

// JavaScript program for the above approach

let MAX = 100001;

// Stores smallest prime

// factor for every number

let spf;

// Stores distinct prime factors

let v;

// Function to find the smallest

// prime factor of every number

function sieve()

{

// Mark the smallest prime factor

// of every number to itself

for (let i = 1; i < MAX; i++)

spf[i] = i;

// Separately mark all the

// smallest prime factor of

// every even number to be 2

for (let i = 4; i < MAX; i = i + 2)

spf[i] = 2;

for (let i = 3; i * i < MAX; i++)

// If i is prime

if (spf[i] == i) {

// Mark spf for all numbers

// divisible by i

for (let j = i * i; j < MAX; j = j + i) {

// Mark spf[j] if it is

// not previously marked

if (spf[j] == j)

spf[j] = i;

}

}

}

// Function to find the distinct

// prime factors

function DistPrime()

{

for (let i = 1; i < MAX; i++) {

let idx = 1;

let x = i;

// Push all distinct of x

// prime factor in v[x]

if (x != 1)

v[i].push(spf[x]);

x = parseInt(x / spf[x], 10);

while (x != 1) {

if (v[i][idx - 1] != spf[x]) {

// Pushback into v[i]

v[i].push(spf[x]);

// Increment the idx

idx += 1;

}

// Update x = (x / spf[x])

x = parseInt(x / spf[x], 10);

}

}

}

// Function to get the distinct

// factor count of arr[]

function getFactorCount(arr, N)

{

// initialization

spf = new Array(MAX);

v = new Array(MAX);

for (let i = 0; i < MAX; i++)

v[i] = [];

// Precompute the smallest

// Prime Factors

sieve();

// For distinct prime factors

// Fill the v[] vector

DistPrime();

// Count of Distinct Prime

// Factors of each array element

for (let i = 0; i < N; i++) {

document.write(v[arr[i]].length + " ");

}

}

let arr = [ 6, 9, 12 ];

let N = arr.length;

getFactorCount(arr, N);

</script>

Output

2 1 2

Time Complexity: O(N * log N)
Auxiliary Space: O(N)



sourav2901

Count distinct prime factors for each element of an array - GeeksforGeeks (2)

Improve

Next Article

Maximize sum of count of distinct prime factors of K array elements

Please Login to comment...

Count distinct prime factors for each element of an array - GeeksforGeeks (2024)
Top Articles
The Joy I Get From This One Trader Joe's Item Is Unmatched
Are Frozen Vegetables Healthy? Nutrition and More
Barstool Sports Gif
9.4: Resonance Lewis Structures
Why Are Fuel Leaks A Problem Aceable
Craigslist Niles Ohio
What Are the Best Cal State Schools? | BestColleges
Pga Scores Cbs
Botanist Workbench Rs3
50 Meowbahh Fun Facts: Net Worth, Age, Birthday, Face Reveal, YouTube Earnings, Girlfriend, Doxxed, Discord, Fanart, TikTok, Instagram, Etc
Is Sportsurge Safe and Legal in 2024? Any Alternatives?
Miss Carramello
Gw2 Legendary Amulet
Lycoming County Docket Sheets
Urinevlekken verwijderen: De meest effectieve methoden - Puurlv
Tcu Jaggaer
Pwc Transparency Report
Zürich Stadion Letzigrund detailed interactive seating plan with seat & row numbers | Sitzplan Saalplan with Sitzplatz & Reihen Nummerierung
George The Animal Steele Gif
Busted Newspaper S Randolph County Dirt The Press As Pawns
Radio Aleluya Dialogo Pastoral
Kaomoji Border
Tracking Your Shipments with Maher Terminal
finaint.com
Mary Kay Lipstick Conversion Chart PDF Form - FormsPal
House Of Budz Michigan
Roster Resource Orioles
The best TV and film to watch this week - A Very Royal Scandal to Tulsa King
Richland Ecampus
China’s UberEats - Meituan Dianping, Abandons Bike Sharing And Ride Hailing - Digital Crew
Rural King Credit Card Minimum Credit Score
Closest Bj Near Me
The Weather Channel Local Weather Forecast
Slim Thug’s Wealth and Wellness: A Journey Beyond Music
European city that's best to visit from the UK by train has amazing beer
Margaret Shelton Jeopardy Age
manhattan cars & trucks - by owner - craigslist
Viduthalai Movie Download
The Bold and the Beautiful
Ofw Pinoy Channel Su
Rocksteady Steakhouse Menu
Oxford Alabama Craigslist
Td Ameritrade Learning Center
My Locker Ausd
Union Corners Obgyn
Suffix With Pent Crossword Clue
Engr 2300 Osu
Ds Cuts Saugus
Scott Surratt Salary
552 Bus Schedule To Atlantic City
Meee Ruh
antelope valley for sale "lancaster ca" - craigslist
Latest Posts
Article information

Author: Tish Haag

Last Updated:

Views: 5753

Rating: 4.7 / 5 (67 voted)

Reviews: 90% of readers found this page helpful

Author information

Name: Tish Haag

Birthday: 1999-11-18

Address: 30256 Tara Expressway, Kutchburgh, VT 92892-0078

Phone: +4215847628708

Job: Internal Consulting Engineer

Hobby: Roller skating, Roller skating, Kayaking, Flying, Graffiti, Ghost hunting, scrapbook

Introduction: My name is Tish Haag, I am a excited, delightful, curious, beautiful, agreeable, enchanting, fancy person who loves writing and wants to share my knowledge and understanding with you.