给定一个只包含小写英文字母的字符串str ,任务是找到str 中字符的所有素数频率的总和和乘积。
例子:
Input: str = “geeksforgeeks”
Output: 6, 8
Only characters ‘g’, ‘k’ and ‘s’ have prime frequencies i.e. 2 + 2 + 2 = 6 and 2 * 2* 2 = 8
Character | frequency |
---|---|
g | 2 |
e | 4 |
k | 2 |
s | 2 |
f | 1 |
o | 1 |
r | 1 |
Input: str = “algorithms”
Output: 0, 0
方法:
- 遍历字符串并将所有字符的频率存储在哈希表中。
- 使用 Sieve Of Eratosthenes 找出质数频率。
- 计算所有这些素数频率的总和和乘积,最后打印总和和乘积。
下面是上述方法的实现:
C++
// C++ program to find Sum and product of Prime
// Frequencies of Characters in a String
#include
using namespace std;
// Function to create Sieve to check primes
void SieveOfEratosthenes(bool prime[], int p_size)
{
// false here indicates
// that it is not prime
prime[0] = false;
prime[1] = false;
for (int p = 2; p * p <= p_size; p++) {
// If prime[p] is not changed,
// then it is a prime
if (prime[p]) {
// Update all multiples of p,
// set them to non-prime
for (int i = p * 2; i <= p_size; i += p)
prime[i] = false;
}
}
}
// Function to find the sum of prime frequencies
// of the characters of the given string
void sumProdOfPrimeFreq(string s)
{
bool prime[s.length() + 1];
memset(prime, true, sizeof(prime));
SieveOfEratosthenes(prime, s.length() + 1);
int i, j;
// map is used to store
// character frequencies
unordered_map m;
for (i = 0; i < s.length(); i++)
m[s[i]]++;
int sum = 0, product = 1;
// Traverse the map
for (auto it = m.begin(); it != m.end(); it++) {
// If the frequency is prime
if (prime[it->second]) {
sum += it->second;
product *= it->second;
}
}
cout << "Sum = " << sum;
cout << "\nProduct = " << product;
}
// Driver code
int main()
{
string s = "geeksforgeeks";
sumProdOfPrimeFreq(s);
return 0;
}
Java
// Java program to find Sum and product of Prime
// Frequencies of Characters in a String
import java.util.*;
class GFG
{
// Function to create Sieve to check primes
static void SieveOfEratosthenes(boolean prime[],
int p_size)
{
// false here indicates
// that it is not prime
prime[0] = false;
prime[1] = false;
for (int p = 2; p * p <= p_size; p++)
{
// If prime[p] is not changed,
// then it is a prime
if (prime[p])
{
// Update all multiples of p,
// set them to non-prime
for (int i = p * 2; i < p_size; i += p)
{
prime[i] = false;
}
}
}
}
// Function to find the sum of prime frequencies
// of the characters of the given string
static void sumProdOfPrimeFreq(char[] s)
{
boolean[] prime = new boolean[s.length + 1];
Arrays.fill(prime, true);
SieveOfEratosthenes(prime, s.length + 1);
int i, j;
// map is used to store
// character frequencies
Map mp = new HashMap<>();
for (i = 0; i < s.length; i++)
{
mp.put(s[i], mp.get(s[i]) == null ? 1 : mp.get(s[i]) + 1);
}
int sum = 0, product = 1;
// Traverse the map
for (Map.Entry it : mp.entrySet())
{
// If the frequency is prime
if (prime[it.getValue()])
{
sum += it.getValue();
product *= it.getValue();
}
}
System.out.print("Sum = " + sum);
System.out.println("\nProduct = " + product);
}
// Driver code
public static void main(String[] args)
{
String s = "geeksforgeeks";
sumProdOfPrimeFreq(s.toCharArray());
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program to find Sum and product of Prime
# Frequencies of Characters in a String
# Function to create Sieve to check primes
def SieveofEratosthenes(prime, p_size):
# false here indicates
# that it is not prime
prime[0] = False
prime[1] = False
for p in range(2, p_size + 1):
# If prime[p] is not changed,
# then it is a prime
if prime[p]:
# Update all multiples of p,
# set them to non-prime
for i in range(p * 2, p_size + 1, p):
prime[i] = False
# Function to find the sum of prime frequencies
# of the characters of the given string
def sumProdOfPrimeFreq(s):
prime = [True] * (len(s) + 2)
SieveofEratosthenes(prime, len(s) + 1)
i = 0
j = 0
# map is used to store
# character frequencies
m = dict()
for i in range(len(s)):
m[s[i]] = (m[s[i]] + 1) if s[i] in m else 1
s = 0
product = 1
# Traverse the map
for it in m:
# If the frequency is prime
if prime[m[it]]:
s += m[it]
product *= m[it]
print("Sum =", s)
print("Product =", product)
# Driver code
if __name__ == "__main__":
s = "geeksforgeeks"
sumProdOfPrimeFreq(s)
# This code is contributed by
# sanjeev2552
C#
// C# program to find Sum and product of Prime
// Frequencies of Characters in a String
using System;
using System.Collections.Generic;
class GFG
{
// Function to create Sieve to check primes
static void SieveOfEratosthenes(bool []prime,
int p_size)
{
// false here indicates
// that it is not prime
prime[0] = false;
prime[1] = false;
for (int p = 2; p * p <= p_size; p++)
{
// If prime[p] is not changed,
// then it is a prime
if (prime[p])
{
// Update all multiples of p,
// set them to non-prime
for (int i = p * 2; i < p_size; i += p)
{
prime[i] = false;
}
}
}
}
// Function to find the sum of prime frequencies
// of the characters of the given string
static void sumProdOfPrimeFreq(char[] s)
{
int i;
bool[] prime = new bool[s.Length + 1];
for(i=0;i mp = new Dictionary();
for (i = 0 ; i < s.Length; i++)
{
if(mp.ContainsKey(s[i]))
{
var val = mp[s[i]];
mp.Remove(s[i]);
mp.Add(s[i], val + 1);
}
else
{
mp.Add(s[i], 1);
}
}
int sum = 0, product = 1;
// Traverse the map
foreach(KeyValuePair it in mp)
{
// If the frequency is prime
if (prime[it.Value])
{
sum += it.Value;
product *= it.Value;
}
}
Console.Write("Sum = " + sum);
Console.WriteLine("\nProduct = " + product);
}
// Driver code
public static void Main(String[] args)
{
String s = "geeksforgeeks";
sumProdOfPrimeFreq(s.ToCharArray());
}
}
// This code is contributed by Princi Singh
Javascript
输出:
Sum = 6
Product = 8