Sum of factorials of Prime numbers in a Linked list
Last Updated :
16 Feb, 2024
Given a Linked list of N integers, the task is to find the sum of factorials of each prime element in the list.
Examples:
Input: L1 = 4 -> 6 -> 2 -> 12 -> 3
Output: 8
Explanation:
Prime numbers are 2 and 3, hence 2! + 3! = 2 + 6 = 8.
Input: L1 = 7 -> 4 -> 5
Output: 5160
Explanation:
Prime numbers are 7 and 5, hence 7! + 5! = 5160.
Approach: To solve the problem mentioned above follow the steps given below:
- Implement a function factorial(n) that finds the factorial of N .
- Initialize a variable sum = 0. Now, traverse the given list and for each node check whether node is prime or not.
- If node is prime then update sum = sum + factorial(node) otherwise else move the node to next.
- Print the calculated sum in the end.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node* next;
};
void push(Node** head_ref, int new_data)
{
Node* new_node
= (Node*) malloc (
sizeof ( struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
int factorial( int n)
{
int f = 1;
for ( int i = 1; i <= n; i++) {
f *= i;
}
return f;
}
bool isPrime( int n)
{
if (n <= 1)
return false ;
if (n <= 3)
return true ;
if (n % 2 == 0 || n % 3 == 0)
return false ;
for ( int i = 5; i * i <= n; i = i + 6)
if (n % i == 0
|| n % (i + 2) == 0)
return false ;
return true ;
}
int sumFactorial(Node* head_1)
{
Node* ptr = head_1;
int s = 0;
while (ptr != NULL) {
if (isPrime(ptr->data)) {
s += factorial(ptr->data);
ptr = ptr->next;
}
else
ptr = ptr->next;
}
return s;
}
int main()
{
Node* head1 = NULL;
push(&head1, 4);
push(&head1, 6);
push(&head1, 2);
push(&head1, 12);
push(&head1, 3);
cout << sumFactorial(head1);
return 0;
}
|
Java
import java.util.*;
class GFG {
static class Node {
int data;
Node next;
};
static Node push(
Node head_ref,
int new_data)
{
Node new_node = new Node();
new_node.data = new_data;
new_node.next = (head_ref);
(head_ref) = new_node;
return head_ref;
}
static int factorial( int n)
{
int f = 1 ;
for ( int i = 1 ; i <= n; i++) {
f *= i;
}
return f;
}
static boolean isPrime( int n)
{
if (n <= 1 )
return false ;
if (n <= 3 )
return true ;
if (n % 2 == 0 || n % 3 == 0 )
return false ;
for ( int i = 5 ; i * i <= n; i = i + 6 )
if (n % i == 0
|| n % (i + 2 ) == 0 )
return false ;
return true ;
}
static int sumFactorial(Node head_1)
{
Node ptr = head_1;
int s = 0 ;
while (ptr != null ) {
if (isPrime(ptr.data)) {
s += factorial(ptr.data);
ptr = ptr.next;
}
else {
ptr = ptr.next;
}
}
return s;
}
public static void main(String args[])
{
Node head1 = null ;
head1 = push(head1, 4 );
head1 = push(head1, 6 );
head1 = push(head1, 2 );
head1 = push(head1, 12 );
head1 = push(head1, 3 );
int ans = sumFactorial(head1);
System.out.println(ans);
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = next
def push( head_ref, new_data) :
new_node = Node( 0 )
new_node.data = new_data
new_node. next = (head_ref)
(head_ref) = new_node
return head_ref
def factorial(n):
f = 1 ;
for i in range ( 1 , n + 1 ):
f * = i;
return f;
def isPrime(n):
if (n < = 1 ):
return False
if (n < = 3 ):
return True
if (n % 2 = = 0 or n % 3 = = 0 ):
return False
i = 5
while ( i * i < = n ):
if (n % i = = 0
or n % (i + 2 ) = = 0 ):
return False
i + = 6 ;
return True
def sumFactorial(head_ref1):
s = 0 ;
ptr1 = head_ref1
while (ptr1 ! = None ) :
if (isPrime(ptr1.data)):
s + = factorial(ptr1.data);
ptr1 = ptr1. next
else :
ptr1 = ptr1. next
return s;
head1 = None
head1 = push(head1, 4 )
head1 = push(head1, 6 )
head1 = push(head1, 2 )
head1 = push(head1, 12 )
head1 = push(head1, 3 )
ans = sumFactorial(head1)
print (ans)
|
C#
using System;
class GFG{
class Node
{
public int data;
public Node next;
};
static Node push(Node head_ref,
int new_data)
{
Node new_node = new Node();
new_node.data = new_data;
new_node.next = (head_ref);
(head_ref) = new_node;
return head_ref;
}
static int factorial( int n)
{
int f = 1;
for ( int i = 1; i <= n; i++)
{
f *= i;
}
return f;
}
static bool isPrime( int n)
{
if (n <= 1)
return false ;
if (n <= 3)
return true ;
if (n % 2 == 0 || n % 3 == 0)
return false ;
for ( int i = 5; i * i <= n;
i = i + 6)
if (n % i == 0 ||
n % (i + 2) == 0)
return false ;
return true ;
}
static int sumFactorial(Node head_1)
{
Node ptr = head_1;
int s = 0;
while (ptr != null )
{
if (isPrime(ptr.data))
{
s += factorial(ptr.data);
ptr = ptr.next;
}
else
{
ptr = ptr.next;
}
}
return s;
}
public static void Main(String []args)
{
Node head1 = null ;
head1 = push(head1, 4);
head1 = push(head1, 6);
head1 = push(head1, 2);
head1 = push(head1, 12);
head1 = push(head1, 3);
int ans = sumFactorial(head1);
Console.WriteLine(ans);
}
}
|
Javascript
<script>
class Node {
constructor() {
this .data = 0;
this .next = null ;
}
}
function push(head_ref, new_data)
{
var new_node = new Node();
new_node.data = new_data;
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
}
function factorial(n) {
var f = 1;
for ( var i = 1; i <= n; i++) {
f *= i;
}
return f;
}
function isPrime(n) {
if (n <= 1) return false ;
if (n <= 3) return true ;
if (n % 2 == 0 || n % 3 == 0) return false ;
for ( var i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0) return false ;
return true ;
}
function sumFactorial(head_1) {
var ptr = head_1;
var s = 0;
while (ptr != null )
{
if (isPrime(ptr.data))
{
s += factorial(ptr.data);
ptr = ptr.next;
} else {
ptr = ptr.next;
}
}
return s;
}
var head1 = null ;
head1 = push(head1, 4);
head1 = push(head1, 6);
head1 = push(head1, 2);
head1 = push(head1, 12);
head1 = push(head1, 3);
var ans = sumFactorial(head1);
document.write(ans);
</script>
|
Method 2 (Sieve of Eratosthenes algorithm)
Algorithm
- Define a function factorial(n) that takes an integer n as input
- It returns the factorial of n using a recursive approach, with base cases for n=0 and n=1.
- Define a function sum_of_factorials_of_primes(head) that takes a linked list head as input
- calculates the sum of factorials of all prime elements in the list.
- Initialize a variable max_value to 0
- Traverse the linked list to find the maximum value.
- Set max_value to the maximum value found.
- Generate a list is_prime of boolean values indicating whether each integer up to max_value is prime or not, using the Sieve of Eratosthenes algorithm.
- Initialize a variable sum to 0
- Traverse the linked list again.
- add the factorial of that value to the sum.
- Return the sum.
C++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
struct Node {
int val;
struct Node* next;
};
int factorial( int n)
{
if (n == 0 || n == 1)
return 1;
else
return n * factorial(n - 1);
}
int sum_of_factorials_of_primes( struct Node* head)
{
int max_value = 0;
struct Node* current = head;
while (current != NULL) {
max_value = max(max_value, current->val);
current = current->next;
}
vector< bool > is_prime(max_value + 1, true );
is_prime[0] = is_prime[1] = false ;
for ( int i = 2; i <= sqrt (max_value); i++) {
if (is_prime[i]) {
for ( int j = i * i; j <= max_value; j += i) {
is_prime[j] = false ;
}
}
}
int sum = 0;
current = head;
while (current != NULL) {
if (current->val <= max_value && is_prime[current->val]) {
sum += factorial(current->val);
}
current = current->next;
}
return sum;
}
int main()
{
struct Node* head = new Node();
struct Node* second = new Node();
struct Node* third = new Node();
struct Node* fourth = new Node();
struct Node* fifth = new Node();
head->val = 4;
head->next = second;
second->val = 6;
second->next = third;
third->val = 2;
third->next = fourth;
fourth->val = 12;
fourth->next = fifth;
fifth->val = 3;
fifth->next = NULL;
int sum = sum_of_factorials_of_primes(head);
cout << sum << endl;
delete head;
delete second;
delete third;
delete fourth;
delete fifth;
return 0;
}
|
Java
class Node {
int val;
Node next;
Node( int val) {
this .val = val;
this .next = null ;
}
}
public class FactorialSum {
static int factorial( int n) {
if (n == 0 || n == 1 )
return 1 ;
else
return n * factorial(n - 1 );
}
static int sumOfFactorialsOfPrimes(Node head) {
int maxVal = 0 ;
Node current = head;
while (current != null ) {
maxVal = Math.max(maxVal, current.val);
current = current.next;
}
boolean [] isPrime = new boolean [maxVal + 1 ];
for ( int i = 2 ; i <= maxVal; i++) {
isPrime[i] = true ;
}
for ( int i = 2 ; i <= Math.sqrt(maxVal); i++) {
if (isPrime[i]) {
for ( int j = i * i; j <= maxVal; j += i) {
isPrime[j] = false ;
}
}
}
int sum = 0 ;
current = head;
while (current != null ) {
if (current.val <= maxVal && isPrime[current.val]) {
sum += factorial(current.val);
}
current = current.next;
}
return sum;
}
public static void main(String[] args) {
Node head = new Node( 4 );
Node second = new Node( 6 );
Node third = new Node( 2 );
Node fourth = new Node( 12 );
Node fifth = new Node( 3 );
head.next = second;
second.next = third;
third.next = fourth;
fourth.next = fifth;
int sum = sumOfFactorialsOfPrimes(head);
System.out.println(sum);
}
}
|
Python3
def factorial(n):
if n = = 0 or n = = 1 :
return 1
else :
return n * factorial(n - 1 )
def sum_of_factorials_of_primes(head):
max_value = 0
current = head
while current ! = None :
max_value = max (max_value, current.val)
current = current. next
is_prime = [ True ] * (max_value + 1 )
is_prime[ 0 ] = is_prime[ 1 ] = False
for i in range ( 2 , int (max_value * * 0.5 ) + 1 ):
if is_prime[i]:
for j in range (i * i, max_value + 1 , i):
is_prime[j] = False
sum = 0
current = head
while current ! = None :
if current.val < = max_value and is_prime[current.val]:
sum + = factorial(current.val)
current = current. next
return sum
class Node:
def __init__( self , val = 0 , next = None ):
self .val = val
self . next = next
head = Node( 4 )
head. next = Node( 6 )
head. next . next = Node( 2 )
head. next . next . next = Node( 12 )
head. next . next . next . next = Node( 3 )
sum = sum_of_factorials_of_primes(head)
print ( sum )
|
C#
using System;
using System.Collections.Generic;
class Node
{
public int val;
public Node next;
}
class Program
{
static int Factorial( int n)
{
if (n == 0 || n == 1)
return 1;
else
return n * Factorial(n - 1);
}
static int SumOfFactorialsOfPrimes(Node head)
{
int maxValue = 0;
Node current = head;
while (current != null )
{
maxValue = Math.Max(maxValue, current.val);
current = current.next;
}
bool [] isPrime = new bool [maxValue + 1];
for ( int i = 0; i <= maxValue; i++)
{
isPrime[i] = true ;
}
isPrime[0] = isPrime[1] = false ;
for ( int i = 2; i <= Math.Sqrt(maxValue); i++)
{
if (isPrime[i])
{
for ( int j = i * i; j <= maxValue; j += i)
{
isPrime[j] = false ;
}
}
}
int sum = 0;
current = head;
while (current != null )
{
if (current.val <= maxValue && isPrime[current.val])
{
sum += Factorial(current.val);
}
current = current.next;
}
return sum;
}
static void Main()
{
Node head = new Node { val = 4 };
Node second = new Node { val = 6 };
Node third = new Node { val = 2 };
Node fourth = new Node { val = 12 };
Node fifth = new Node { val = 3 };
head.next = second;
second.next = third;
third.next = fourth;
fourth.next = fifth;
fifth.next = null ;
int sum = SumOfFactorialsOfPrimes(head);
Console.WriteLine(sum);
}
}
|
Javascript
class Node {
constructor(val) {
this .val = val;
this .next = null ;
}
}
function factorial(n) {
if (n === 0 || n === 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
function sumOfFactorialsOfPrimes(head) {
let max_value = 0;
let current = head;
while (current !== null ) {
max_value = Math.max(max_value, current.val);
current = current.next;
}
let is_prime = new Array(max_value + 1).fill( true );
is_prime[0] = is_prime[1] = false ;
for (let i = 2; i <= Math.sqrt(max_value); i++) {
if (is_prime[i]) {
for (let j = i * i; j <= max_value; j += i) {
is_prime[j] = false ;
}
}
}
let sum = 0;
current = head;
while (current !== null ) {
if (current.val <= max_value && is_prime[current.val]) {
sum += factorial(current.val);
}
current = current.next;
}
return sum;
}
const head = new Node(4);
const second = new Node(6);
const third = new Node(2);
const fourth = new Node(12);
const fifth = new Node(3);
head.next = second;
second.next = third;
third.next = fourth;
fourth.next = fifth;
const sum = sumOfFactorialsOfPrimes(head);
console.log(sum);
|
Time complexity : O(n*max_value+max_value*log(log(max_value))), where n is the length of the linked list and max_value is the maximum value in the linked list,
Space complexity : O(max_value) for the is_prime list.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...