计算具有所有素数的给定矩阵中的行数和列数
给定一个大小为N*M的二维矩阵arr[] ,任务是找出所有素数的行数和列数。
例子:
Input: arr[]= { { 2, 5, 7 }, { 3, 10, 4 }, { 11, 13, 17 } };
Output: 3
Explanation:
2 Rows: {2, 5, 7}, {11, 13, 17}
1 Column: {2, 3, 11}
Input: arr[]={ { 1, 4 }, { 4, 6 } }
Output: 0
方法:按照以下步骤解决此问题:
- 应用 Sieve 算法找出所有素数。
- 逐行遍历所有元素以找到具有所有素数的行数。
- 对所有列应用上述步骤。
- 根据上述观察返回答案。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
#define MAXN 5000
bool prime[MAXN + 1];
// Sieve to find prime numbers
void SieveOfEratosthenes(int n)
{
memset(prime, true, sizeof(prime));
for (int p = 2; p * p <= n; p++) {
if (prime[p] == true) {
for (int i = p * p; i <= n; i += p) {
prime[i] = false;
}
}
}
}
// Function to find the number of rows
// and columns having all primes
int primeRowCol(vector >& arr)
{
int N = arr.size();
int M = arr[0].size();
SieveOfEratosthenes(MAXN);
int cnt = 0;
// Counting Rows with all primes
for (int i = 0; i < N; i++) {
bool flag = 1;
for (int j = 0; j < M; ++j) {
if (!prime[arr[i][j]]) {
flag = 0;
break;
}
}
if (flag) {
cnt += 1;
}
}
// Counting Cols with all primes
for (int i = 0; i < M; i++) {
bool flag = 1;
for (int j = 0; j < N; ++j) {
if (!prime[arr[j][i]]) {
flag = 0;
break;
}
}
if (flag) {
cnt += 1;
}
}
return cnt;
}
// Driver Code
int main()
{
vector > arr
= { { 2, 5, 7 }, { 3, 10, 4 }, { 11, 13, 17 } };
cout << primeRowCol(arr);
}
Java
// Java program for the above approach
class GFG {
static int MAXN = 5000;
static boolean[] prime = new boolean[MAXN + 1];
// Sieve to find prime numbers
static void SieveOfEratosthenes(int n) {
for (int i = 0; i < MAXN; i++) {
prime[i] = true;
}
for (int p = 2; p * p <= n; p++) {
if (prime[p] == true) {
for (int i = p * p; i <= n; i += p) {
prime[i] = false;
}
}
}
}
// Function to find the number of rows
// and columns having all primes
static int primeRowCol(int[][] arr) {
int N = arr.length;
int M = arr[0].length;
SieveOfEratosthenes(MAXN);
int cnt = 0;
// Counting Rows with all primes
for (int i = 0; i < N; i++) {
boolean flag = true;
for (int j = 0; j < M; ++j) {
if (!prime[arr[i][j]]) {
flag = false;
break;
}
}
if (flag) {
cnt += 1;
}
}
// Counting Cols with all primes
for (int i = 0; i < M; i++) {
boolean flag = true;
for (int j = 0; j < N; ++j) {
if (!prime[arr[j][i]]) {
flag = false;
break;
}
}
if (flag) {
cnt += 1;
}
}
return cnt;
}
// Driver Code
public static void main(String args[]) {
int[][] arr = { { 2, 5, 7 }, { 3, 10, 4 }, { 11, 13, 17 } };
System.out.println(primeRowCol(arr));
}
}
// This code is contributed by gfgking
Python3
# Python 3 program for the above approach
MAXN = 5000
prime = [True]*(MAXN + 1)
# Sieve to find prime numbers
def SieveOfEratosthenes(n):
p = 2
while p * p <= n:
if (prime[p] == True):
for i in range(p * p, n + 1, p):
prime[i] = False
p += 1
# Function to find the number of rows
# and columns having all primes
def primeRowCol(arr):
N = len(arr)
M = len(arr[0])
SieveOfEratosthenes(MAXN)
cnt = 0
# Counting Rows with all primes
for i in range(N):
flag = 1
for j in range(M):
if (not prime[arr[i][j]]):
flag = 0
break
if (flag):
cnt += 1
# Counting Cols with all primes
for i in range(M):
flag = 1
for j in range(N):
if (not prime[arr[j][i]]):
flag = 0
break
if (flag):
cnt += 1
return cnt
# Driver Code
if __name__ == "__main__":
arr = [[2, 5, 7], [3, 10, 4], [11, 13, 17]]
print(primeRowCol(arr))
# This code is contributed by ukasp.
C#
// C# program for the above approach
using System;
class GFG
{
static int MAXN = 5000;
static bool []prime = new bool[MAXN + 1];
// Sieve to find prime numbers
static void SieveOfEratosthenes(int n)
{
for(int i = 0; i < MAXN; i++){
prime[i] = true;
}
for (int p = 2; p * p <= n; p++) {
if (prime[p] == true) {
for (int i = p * p; i <= n; i += p) {
prime[i] = false;
}
}
}
}
// Function to find the number of rows
// and columns having all primes
static int primeRowCol(int [,]arr)
{
int N = arr.GetLength(0);
int M = arr.GetLength(1);
SieveOfEratosthenes(MAXN);
int cnt = 0;
// Counting Rows with all primes
for (int i = 0; i < N; i++) {
bool flag = true;
for (int j = 0; j < M; ++j) {
if (!prime[arr[i, j]]) {
flag = false;
break;
}
}
if (flag) {
cnt += 1;
}
}
// Counting Cols with all primes
for (int i = 0; i < M; i++) {
bool flag = true;
for (int j = 0; j < N; ++j) {
if (!prime[arr[j, i]]) {
flag = false;
break;
}
}
if (flag) {
cnt += 1;
}
}
return cnt;
}
// Driver Code
public static void Main()
{
int [,]arr
= { { 2, 5, 7 }, { 3, 10, 4 }, { 11, 13, 17 } };
Console.Write(primeRowCol(arr));
}
}
// This code is contributed by Samim Hosdsain Mondal.
Javascript
输出
3
时间复杂度: O(N*M)
辅助空间: O(max(arr))