📜  在二进制编号的圆中仅使用1的常规多边形

📅  最后修改于: 2021-05-06 09:47:59             🧑  作者: Mango

给定二进制整数数组,假设这些值以相等的距离保留在圆的圆周上。我们需要确定是否可以仅使用1s作为顶点绘制规则多边形,如果可以,则打印规则多边形具有的最大边数。

例子:

输入:arr [] = [1,1,1,0,1,0]输出:边长为3的可能多边形我们可以绘制一个以1s为顶点的正三角形,如下图(a)所示。输入:arr [] = [1,0,1,0,1,0,1,0,1,1]输出:边长为5的多边形我们可以绘制一个顶点为1s的正五边形,如下所示图(b)。

我们可以通过获取可能的多边形可以拥有的顶点数量与数组中值总数之间的关系来解决此问题。让一个可能的规则多边形在圆中具有K个顶点或K个边,那么它应该满足两个条件才能成为答案:
如果给定的数组大小为N,则K应该除以N,否则K个顶点不能以相等的方式将N个顶点除以成为规则多边形。
接下来的事情是,所选多边形的每个顶点都应该有一个顶点。
经过以上几点,我们可以看到,要解决此问题,我们需要遍历N的除数,然后检查数组在选定除数距离处的每个值是否为1。如果为1,那么我们找到了解决方案。我们只需迭代1到sqrt(N)就可以迭代O(sqrt(N))时间中的所有除数。您可以在此处了解更多有关此内容的信息。

C++
// C++ program to find whether a regular polygon
// is possible in circle with 1s as vertices
#include 
using namespace std;
  
// method returns true if polygon is possible with
// 'midpoints' number of midpoints
bool checkPolygonWithMidpoints(int arr[], int N,
                                  int midpoints)
{
    // loop for getting first vertex of polygon
    for (int j = 0; j < midpoints; j++)
    {
        int val = 1;
  
        // loop over array values at 'midpoints' distance
        for (int k = j; k < N; k += midpoints)
        {
            // and(&) all those values, if even one of
            // them is 0, val will be 0
            val &= arr[k];
        }
  
        /*  if val is still 1 and (N/midpoints) or (number
            of vertices) are more than two (for a polygon
            minimum) print result and return true */
        if (val && N/midpoints > 2)
        {
            cout << "Polygon possible with side length " <<
                 << (N/midpoints) << endl;
            return true;
        }
    }
    return false;
}
  
// method prints sides in the polygon or print not
// possible in case of no possible polygon
void isPolygonPossible(int arr[], int N)
{
    //  limit for iterating over divisors
    int limit = sqrt(N);
    for (int i = 1; i <= limit; i++)
    {
        // If i divides N then i and (N/i) will
        // be divisors
        if (N % i == 0)
        {
            //  check polygon for both divisors
            if (checkPolygonWithMidpoints(arr, N, i) ||
                checkPolygonWithMidpoints(arr, N, (N/i)))
                return;
        }
    }
  
    cout << "Not possiblen";
}
  
// Driver code to test above methods
int main()
{
    int arr[] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 1};
    int N = sizeof(arr) / sizeof(arr[0]);
    isPolygonPossible(arr, N);
    return 0;
}


Java
// Java program to find whether a regular polygon
// is possible in circle with 1s as vertices
  
class Test
{
    // method returns true if polygon is possible with
    // 'midpoints' number of midpoints
    static boolean checkPolygonWithMidpoints(int arr[], int N,
                                      int midpoints)
    {
        // loop for getting first vertex of polygon
        for (int j = 0; j < midpoints; j++)
        {
            int val = 1;
       
            // loop over array values at 'midpoints' distance
            for (int k = j; k < N; k += midpoints)
            {
                // and(&) all those values, if even one of
                // them is 0, val will be 0
                val &= arr[k];
            }
       
            /*  if val is still 1 and (N/midpoints) or (number
                of vertices) are more than two (for a polygon
                minimum) print result and return true */
            if (val != 0 && N/midpoints > 2)
            {
                System.out.println("Polygon possible with side length " +
                                               N/midpoints);
                return true;
            }
        }
        return false;
    }
       
    // method prints sides in the polygon or print not
    // possible in case of no possible polygon
    static void isPolygonPossible(int arr[], int N)
    {
        //  limit for iterating over divisors
        int limit = (int)Math.sqrt(N);
        for (int i = 1; i <= limit; i++)
        {
            // If i divides N then i and (N/i) will
            // be divisors
            if (N % i == 0)
            {
                //  check polygon for both divisors
                if (checkPolygonWithMidpoints(arr, N, i) ||
                    checkPolygonWithMidpoints(arr, N, (N/i)))
                    return;
            }
        }
       
        System.out.println("Not possible");
    }
      
    // Driver method
    public static void main(String args[])
    {
        int arr[] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 1};
  
        isPolygonPossible(arr, arr.length);
    }
}


Python3
# Python3 program to find whether a 
# regular polygon is possible in circle
# with 1s as vertices 
from math import sqrt 
  
# method returns true if polygon is 
# possible with 'midpoints' number
# of midpoints 
def checkPolygonWithMidpoints(arr, N, midpoints) :
  
    # loop for getting first vertex of polygon 
    for j in range(midpoints) :
      
        val = 1
  
        # loop over array values at 
        # 'midpoints' distance 
        for k in range(j , N, midpoints) :
              
            # and(&) all those values, if even  
            # one of them is 0, val will be 0 
            val &= arr[k]
          
        # if val is still 1 and (N/midpoints) or (number 
        # of vertices) are more than two (for a polygon 
        # minimum) print result and return true 
        if (val and N // midpoints > 2) :
          
            print("Polygon possible with side length" ,
                                      (N // midpoints)) 
            return True
      
    return False
  
# method prints sides in the polygon or print 
# not possible in case of no possible polygon 
def isPolygonPossible(arr, N) :
  
    # limit for iterating over divisors 
    limit = sqrt(N)
    for i in range(1, int(limit) + 1) : 
          
        # If i divides N then i and (N/i) 
        # will be divisors 
        if (N % i == 0) :
          
            # check polygon for both divisors 
            if (checkPolygonWithMidpoints(arr, N, i) or
                checkPolygonWithMidpoints(arr, N, (N // i))):
                return
          
    print("Not possiblen")
  
# Driver code 
if __name__ == "__main__" : 
  
    arr = [1, 0, 1, 0, 1, 0, 1, 0, 1, 1] 
    N = len(arr) 
    isPolygonPossible(arr, N)
  
# This code is contributed by Ryuga


C#
// C# program to find whether 
// a regular polygon is possible
// in circle with 1s as vertices
using System;
  
class GFG
{
      
// method returns true if 
// polygon is possible 
// with 'midpoints' number
// of midpoints
static bool checkPolygonWithMidpoints(int []arr, int N,
                                      int midpoints)
{
    // loop for getting first
    // vertex of polygon
    for (int j = 0; j < midpoints; j++)
    {
        int val = 1;
  
        // loop over array values 
        // at 'midpoints' distance
        for (int k = j; k < N; k += midpoints)
        {
            // and(&) all those values, 
            // if even one of them is 0,
            // val will be 0
            val &= arr[k];
        }
  
        /* if val is still 1 and 
           (N/midpoints) or (number
           of vertices) are more than 
           two (for a polygon minimum) 
           print result and return true */
        if (val != 0 && N / midpoints > 2)
        {
            Console.WriteLine("Polygon possible with " + 
                                        "side length " +
                                         N / midpoints);
            return true;
        }
    }
    return false;
}
  
// method prints sides in the 
// polygon or print not possible
// in case of no possible polygon
static void isPolygonPossible(int []arr, 
                              int N)
{
    // limit for iterating
    // over divisors
    int limit = (int)Math.Sqrt(N);
    for (int i = 1; i <= limit; i++)
    {
        // If i divides N then i 
        // and (N/i) will be divisors
        if (N % i == 0)
        {
            // check polygon for
            // both divisors
            if (checkPolygonWithMidpoints(arr, N, i) ||
                checkPolygonWithMidpoints(arr, N, (N / i)))
                return;
        }
    }
  
    Console.WriteLine("Not possible");
}
  
// Driver Code
static public void Main ()
{
    int []arr = {1, 0, 1, 0, 1,
                 0, 1, 0, 1, 1};
  
    isPolygonPossible(arr, arr.Length);
}
}
  
// This code is contributed by jit_t


PHP
 2)
        {
            echo "Polygon possible with side length " ,
                              ($N / $midpoints) , "\n";
            return true;
        }
    }
    return false;
}
  
// method prints sides in 
// the polygon or print not
// possible in case of no
// possible polygon
function isPolygonPossible($arr, $N)
{
    // limit for iterating
    // over divisors
    $limit = sqrt($N);
    for ($i = 1; $i <= $limit; $i++)
    {
        // If i divides N then
        // i and (N/i) will be
        // divisors
        if ($N % $i == 0)
        {
            // check polygon for
            // both divisors
            if (checkPolygonWithMidpoints($arr, $N, $i) ||
                checkPolygonWithMidpoints($arr, $N, ($N / $i)))
                return;
        }
    }
  
echo "Not possiblen";
}
  
// Driver Code
$arr = array(1, 0, 1, 0, 1,
             0, 1, 0, 1, 1);
$N = sizeof($arr);
isPolygonPossible($arr, $N);
  
// This code is contributed by ajit
?>


输出:

Polygon possible with side length 5