📜  特殊筛子中未标记整数的数量

📅  最后修改于: 2021-04-29 12:49:07             🧑  作者: Mango

给定一个数组A,其中包含从2到N的数字。对其进行了特殊的筛分。
筛分程序如下:

  1. 创建一个元素为2到N的连续整数的数组,并将数组中的每个元素标记为未标记。
  2. 让的整数Q = N标记Q的所有适当的除数除Q本身在数组中。
  3. 找到未标记的小于Q的最大数字,并为其分配Q,然后从步骤2开始重复。如果没有更多未标记的元素,则停止。

筛选后查找未标记整数的数量。

例子:

Input : N = 5 
Output : Number of unmarked elements = 3
Explanation : We create array A[] = { 2, 3, 4, 5 }.
2 is marked as it is a proper divisor of 4.

Input : N = 4
Output : Number of unmarked elements = 2

天真的方法:
一种基本方法是运行两个循环。外循环遍历整个数组,内循环遍历2 – Q,通过检查a [i]%Q = 0取消标记Q的所有适当除数

时间复杂度: O(N ^ 2)

高效方法:
一个简单的观察表明,实际上无需在此处进行筛分,N的值将确定答案。
情况1:如果N为奇数,则未标记元素的数量将为(N / 2)+ 1。

情况2:如果N为偶数,则未标记元素的数量将为(N / 2)。

时间复杂度: O(1)

例子:

C++
// C++ Program to determine the 
// number of unmarked integers in 
// a special sieve
#include 
using namespace std;
  
int countUnmarked(int N)
{
    if (N % 2 == 0)
       return N/2;
    else
       return N/2 + 1;
}
  
// Driver Code
int main()
{
    int N = 4;
    cout << "Number of unmarked elements: " 
         << countUnmarked(N) << endl;
    return 0;
}


Java
// Java Program to determine 
// the number of unmarked 
// integers in a special sieve
import java.io.*;
  
class GFG
{
static int countUnmarked(int N)
{
    if (N % 2 == 0)
    return N / 2;
    else
    return N / 2 + 1;
}
  
// Driver Code
public static void main (String[] args) 
{
    int N = 4;
    System.out.println("Number of unmarked " + 
                                "elements: " + 
                            countUnmarked(N));
}
}
  
// This code is contributed
// by anuj_67.


Python3
# Python3 Program to determine 
# the number of unmarked 
# integers in a special sieve
def countUnmarked(N):
    if (N % 2 == 0):
        return N / 2;
    else:
        return N / 2 + 1;
  
# Driver Code
N = 4;
print("Number of unmarked elements:", 
              int(countUnmarked(N)));
      
# This code is contributed
# by mits


C#
// C# Program to determine 
// the number of unmarked 
// integers in a special sieve
using System;
  
class GFG
{
static int countUnmarked(int N)
{
    if (N % 2 == 0)
        return N / 2;
    else
        return N / 2 + 1;
}
  
// Driver Code
public static void Main () 
{
    int N = 4;
    Console.WriteLine("Number of unmarked " + 
                               "elements: " + 
                           countUnmarked(N));
}
}
  
// This code is contributed
// by anuj_67.


PHP


输出:
Number of unmarked elements: 2