📌  相关文章
📜  检查给定的数字 K 是否足以到达数组的末尾

📅  最后修改于: 2022-05-13 01:57:49.920000             🧑  作者: Mango

检查给定的数字 K 是否足以到达数组的末尾

给定一个包含 n 个元素的数组 arr[] 和一个数字 K。任务是通过执行以下操作来确定是否有可能到达数组的末尾:
遍历给定的数组,并且,

  • 如果发现任何元素不是素数,则将 K 的值减 1。
  • 如果任何元素是素数,则将 K 的值重新填充为其初始值。

如果 (K > 0) 可以到达数组的末尾,则打印 YES,否则打印 NO。

例子

Input : K = 2, arr[]={ 6, 3, 4, 5, 6};
Output : Yes
Explanation :
 1- arr[0] is not prime, so K = K-1 = 1
 2- arr[1] is prime so K will be refilled to its 
    initial value. Therefore,  K = 2.
 3- arr[2] is not prime.
    Therefore,  K = 2-1 = 1
 4- arr[3] is prime so K will be refilled to its 
    initial value. Therefore,  K = 2.
 5- arr[4] is not prime.
    Therefore,  K = 2-1 = 1
 6- Since the end of the array is reached with K>=0
    So output is YES

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

推荐:请先在“练习”上解决,然后再继续解决。

简单的方法

  • 遍历数组的每个元素并检查当前元素的值是否为素数。
  • 如果它是素数,则重新填充 K 的幂,否则减 1。
  • 如果 (K > 0) 可以到达数组的末尾,则打印“YES”,否则打印“NO”。

下面是上述方法的实现:

C++
// C++ program to check if it is possible
// to reach the end of the array
#include 
using namespace std;
 
// Function To check number is prime or not
bool is_Prime( int num )
{
    // because 1 is not prime
    if(num == 1)
    return false;
     
    for(int i=2 ; i*i <= num ; i++ )
    {
        if( num % i == 0 )
        return false;
    }
     
return true;
}
 
// Function to check whether it is possible
// to reach the end of the array or not    
bool isReachable( int arr[] , int n , int k)
{  
    // store initial value of K
    int x = k ;
             
    for(int i=0 ; i < n ; i++ )
    {
        // Call is_prime function to
        // check if a number is prime.
        if( is_Prime(arr[i]) )
        {
            // Refill K to initial value
            k = x;
        }                
        else
        {
            // Decrement k by 1
            k-- ;                
        }
 
     
        if( k <= 0 && i < (n-1) && (!is_Prime(arr[i+1])) )
            return false ;
    }
             
    return true ;
}
 
// Driver Code
int main()
{
    int arr[] = { 6, 3, 4, 5, 6};
    int n = sizeof(arr)/sizeof(arr[0]) ;
    int k = 2 ;
 
         
    isReachable( arr , n , k ) ? cout << "Yes" << endl :
                                    cout << "No" << endl ;
         
    return 0 ;
}


Java
// Java program to check if
// it is possible to reach
// the end of the array
import java.io.*;
import java.util.*;
import java.lang.*;
 
class GFG
{
     
// Function To check
// number is prime or not
static boolean is_Prime(int num)
{
    // because 1 is not prime
    if(num == 1)
    return false;
     
    for(int i = 2 ;
            i * i <= num ; i++ )
    {
        if(num % i == 0)
        return false;
    }
     
return true;
}
 
// Function to check whether
// it is possible to reach
// the end of the array or not    
static boolean isReachable(int arr[] ,
                           int n , int k)
{
    // store initial value of K
    int x = k ;
             
    for(int i = 0 ; i < n ; i++ )
    {
        // Call is_prime function to
        // check if a number is prime.
        if(is_Prime(arr[i]))
        {
            // Refill K to
            // initial value
            k = x;
        }                
        else
        {
            // Decrement k by 1
            k-- ;                
        }
 
     
        if(k <= 0 && i < (n - 1) &&
          (is_Prime(arr[i + 1]) != true))
            return false ;
    }
             
    return true ;
}
 
// Driver Code
public static void main(String args[])
{
    int arr[] = new int[]{ 6, 3, 4, 5, 6};
    int n = arr.length;
    int k = 2 ;
 
    if(isReachable(arr, n, k) == true)
        System.out.print("Yes" + "\n");
     else
        System.out.print("No" + "\n");
}
}


Python3
# Python 3 program to check if it is
# possible to reach the end of the array
from math import sqrt
 
# Function To check number is prime or not
def is_Prime(num):
     
    # because 1 is not prime
    if(num == 1):
        return False
    k = int(sqrt(num)) + 1
 
    for i in range(2, k, 1):
        if(num % i == 0):
            return False
             
    return True
 
# Function to check whether it is possible
# to reach the end of the array or not
def isReachable(arr, n , k):
     
    # store initial value of K
    x = k
             
    for i in range(0, n, 1):
         
        # Call is_prime function to
        # check if a number is prime.
        if( is_Prime(arr[i])):
             
            # Refill K to initial value
            k = x    
        else:
             
            # Decrement k by 1
            k -= 1       
     
        if(k <= 0 and i < (n - 1) and
          (is_Prime(arr[i + 1])) == False):
            return False
             
    return True
 
# Driver Code
if __name__ == '__main__':
    arr = [6, 3, 4, 5, 6]
    n = len(arr)
    k = 2
 
    if (isReachable( arr , n , k )):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by
# Sahil_Shelangia


C#
// C# program to check if
// it is possible to reach
// the end of the array
using System;
 
class GFG
{
     
// Function To check
// number is prime or not
static bool is_Prime(int num)
{
    // because 1 is not prime
    if(num == 1)
    return false;
     
    for(int i = 2 ;
            i * i <= num ; i++ )
    {
        if(num % i == 0)
        return false;
    }
     
return true;
}
 
// Function to check whether
// it is possible to reach
// the end of the array or not
static bool isReachable(int []arr ,
                        int n , int k)
{
    // store initial
    // value of K
    int x = k ;
             
    for(int i = 0 ; i < n ; i++ )
    {
        // Call is_prime function
        // to check if a number
        // is prime.
        if(is_Prime(arr[i]))
        {
            // Refill K to
            // initial value
            k = x;
        }            
        else
        {
            // Decrement k by 1
            k-- ;            
        }
 
     
        if(k <= 0 && i < (n - 1) &&
        (is_Prime(arr[i + 1]) != true))
            return false ;
    }
             
    return true ;
}
 
// Driver Code
public static void Main()
{
    int []arr = new int[]{ 6, 3, 4, 5, 6};
    int n = arr.Length;
    int k = 2 ;
 
    if(isReachable(arr, n, k) == true)
        Console.WriteLine("Yes" + "\n");
    else
        Console.WriteLine("No" + "\n");
}
}
 
// This code is contributed by vt_m


PHP


Javascript


C++
// C++ program to check if it is possible
// to reach the end of the array
#include 
#define MAX 1000000
using namespace std;
 
// Function for Sieve of Eratosthenes
void SieveOfEratosthenes( int sieve[], int max )
{  
    for(int i=0; i


Java
// Java program to check if it is possible
// to reach the end of the array
class GFG
{
 
    static int MAX = 1000000;
 
    // Function for Sieve of Eratosthenes
    static void SieveOfEratosthenes(int sieve[], int max)
    {
        for (int i = 0; i < max; i++)
        {
            sieve[i] = 1;
        }
 
        for (int i = 2; i * i < max; i++)
        {
            if (sieve[i] == 1)
            {
                for (int j = i * 2; j < max; j += i)
                {
                    sieve[j] = 0;
                }
            }
        }
    }
 
    // Function to check if it is possible to
    // reach end of the array    
    static boolean isReachable(int arr[], int n,
                                int sieve[], int k)
    {
        // store initial value of K
        int x = k;
 
        for (int i = 0; i < n; i++)
        {
            if (sieve[arr[i]] == 1)
            {
                // Refill K to initial value
                k = x;
            }
            else
            {
                // Decrement k by 1
                k -= 1;
            }
 
            if ((k <= 0) && (i < (n - 1))
                    && (sieve[arr[i + 1]] == 0))
            {
                return false;
            }
        }
 
        return true;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int arr[] = {6, 3, 4, 5, 6};
        int[] sieve = new int[MAX];
        int n = arr.length;
        int k = 2;
 
        SieveOfEratosthenes(sieve, MAX);
 
        if (isReachable(arr, n, sieve, k))
        {
            System.out.println("Yes");
        }
        else
        {
            System.out.println("No");
        }
    }
}
 
/* This code contributed by PrinciRaj1992 */


Python3
# Python3 program to check if it is
# possible to reach the end of the
# array
import math
 
# Function for Sieve of Eratosthenes
def SieveOfEratosthenes(sieve, max):
     
    for i in range(0, max):
        sieve[i] = 1
         
    sqt = int(math.sqrt(max))
     
    for i in range(2, sqt):
        if (sieve[i] == 1):
            for j in range(i * 2, max, i):
                sieve[j] = 0
 
# Function to check if it is possible to
# reach end of the array    
def isReachable(arr, n, sieve, k):
     
    # store initial value of K
    x = k
    for i in range(0, n):
        if (sieve[arr[i]] != 0):
             
            # Refill K to initial value
            k = x       
        else:
             
            # Decrement k by 1
            k -= 1
        if ((k <= 0) and (i < (n - 1)) and
           (sieve[arr[i + 1]] == 0)):
            return 0
             
    return 1
 
# Driver Code
arr = [ 6, 3, 4, 5, 6 ]
sieve = [0 for x in range(1000000)]
 
n = len(arr)
k = 2
 
SieveOfEratosthenes(sieve, 1000000)
 
ch = isReachable(arr, n, sieve, k)
 
if (ch):
    print("Yes")
else:
    print("No")
     
# This code is contributed by Stream_Cipher


C#
// C# program to check if it is possible
// to reach the end of the array
using System;
 
class GFG
{
    static int MAX = 1000000;
 
    // Function for Sieve of Eratosthenes
    static void SieveOfEratosthenes(int []sieve, int max)
    {
        for (int i = 0; i < max; i++)
        {
            sieve[i] = 1;
        }
 
        for (int i = 2; i * i < max; i++)
        {
            if (sieve[i] == 1)
            {
                for (int j = i * 2; j < max; j += i)
                {
                    sieve[j] = 0;
                }
            }
        }
    }
 
    // Function to check if it is possible to
    // reach end of the array
    static bool isReachable(int []arr, int n,
                                int []sieve, int k)
    {
        // store initial value of K
        int x = k;
 
        for (int i = 0; i < n; i++)
        {
            if (sieve[arr[i]] == 1)
            {
                // Refill K to initial value
                k = x;
            }
            else
            {
                // Decrement k by 1
                k -= 1;
            }
 
            if ((k <= 0) && (i < (n - 1))
                    && (sieve[arr[i + 1]] == 0))
            {
                return false;
            }
        }
 
        return true;
    }
 
    // Driver Code
    static public void Main ()
    {
        int []arr = {6, 3, 4, 5, 6};
        int[] sieve = new int[MAX];
        int n = arr.Length;
        int k = 2;
 
        SieveOfEratosthenes(sieve, MAX);
 
        if (isReachable(arr, n, sieve, k))
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}
 
/* This code contributed by ajit. */


Javascript


输出:
Yes

时间复杂度: O(N(sqrt N))

有效的方法:上述方法可以通过使用埃拉托色尼筛来优化,以检查一个数字是否为素数。

下面是高效方法的实现:

C++

// C++ program to check if it is possible
// to reach the end of the array
#include 
#define MAX 1000000
using namespace std;
 
// Function for Sieve of Eratosthenes
void SieveOfEratosthenes( int sieve[], int max )
{  
    for(int i=0; i

Java

// Java program to check if it is possible
// to reach the end of the array
class GFG
{
 
    static int MAX = 1000000;
 
    // Function for Sieve of Eratosthenes
    static void SieveOfEratosthenes(int sieve[], int max)
    {
        for (int i = 0; i < max; i++)
        {
            sieve[i] = 1;
        }
 
        for (int i = 2; i * i < max; i++)
        {
            if (sieve[i] == 1)
            {
                for (int j = i * 2; j < max; j += i)
                {
                    sieve[j] = 0;
                }
            }
        }
    }
 
    // Function to check if it is possible to
    // reach end of the array    
    static boolean isReachable(int arr[], int n,
                                int sieve[], int k)
    {
        // store initial value of K
        int x = k;
 
        for (int i = 0; i < n; i++)
        {
            if (sieve[arr[i]] == 1)
            {
                // Refill K to initial value
                k = x;
            }
            else
            {
                // Decrement k by 1
                k -= 1;
            }
 
            if ((k <= 0) && (i < (n - 1))
                    && (sieve[arr[i + 1]] == 0))
            {
                return false;
            }
        }
 
        return true;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int arr[] = {6, 3, 4, 5, 6};
        int[] sieve = new int[MAX];
        int n = arr.length;
        int k = 2;
 
        SieveOfEratosthenes(sieve, MAX);
 
        if (isReachable(arr, n, sieve, k))
        {
            System.out.println("Yes");
        }
        else
        {
            System.out.println("No");
        }
    }
}
 
/* This code contributed by PrinciRaj1992 */

Python3

# Python3 program to check if it is
# possible to reach the end of the
# array
import math
 
# Function for Sieve of Eratosthenes
def SieveOfEratosthenes(sieve, max):
     
    for i in range(0, max):
        sieve[i] = 1
         
    sqt = int(math.sqrt(max))
     
    for i in range(2, sqt):
        if (sieve[i] == 1):
            for j in range(i * 2, max, i):
                sieve[j] = 0
 
# Function to check if it is possible to
# reach end of the array    
def isReachable(arr, n, sieve, k):
     
    # store initial value of K
    x = k
    for i in range(0, n):
        if (sieve[arr[i]] != 0):
             
            # Refill K to initial value
            k = x       
        else:
             
            # Decrement k by 1
            k -= 1
        if ((k <= 0) and (i < (n - 1)) and
           (sieve[arr[i + 1]] == 0)):
            return 0
             
    return 1
 
# Driver Code
arr = [ 6, 3, 4, 5, 6 ]
sieve = [0 for x in range(1000000)]
 
n = len(arr)
k = 2
 
SieveOfEratosthenes(sieve, 1000000)
 
ch = isReachable(arr, n, sieve, k)
 
if (ch):
    print("Yes")
else:
    print("No")
     
# This code is contributed by Stream_Cipher

C#

// C# program to check if it is possible
// to reach the end of the array
using System;
 
class GFG
{
    static int MAX = 1000000;
 
    // Function for Sieve of Eratosthenes
    static void SieveOfEratosthenes(int []sieve, int max)
    {
        for (int i = 0; i < max; i++)
        {
            sieve[i] = 1;
        }
 
        for (int i = 2; i * i < max; i++)
        {
            if (sieve[i] == 1)
            {
                for (int j = i * 2; j < max; j += i)
                {
                    sieve[j] = 0;
                }
            }
        }
    }
 
    // Function to check if it is possible to
    // reach end of the array
    static bool isReachable(int []arr, int n,
                                int []sieve, int k)
    {
        // store initial value of K
        int x = k;
 
        for (int i = 0; i < n; i++)
        {
            if (sieve[arr[i]] == 1)
            {
                // Refill K to initial value
                k = x;
            }
            else
            {
                // Decrement k by 1
                k -= 1;
            }
 
            if ((k <= 0) && (i < (n - 1))
                    && (sieve[arr[i + 1]] == 0))
            {
                return false;
            }
        }
 
        return true;
    }
 
    // Driver Code
    static public void Main ()
    {
        int []arr = {6, 3, 4, 5, 6};
        int[] sieve = new int[MAX];
        int n = arr.Length;
        int k = 2;
 
        SieveOfEratosthenes(sieve, MAX);
 
        if (isReachable(arr, n, sieve, k))
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}
 
/* This code contributed by ajit. */

Javascript


输出:
Yes

时间复杂度: O(? Max * loglog(Max)) + O(n)