给定整数元素的数组arr [] ,任务是找到arr []的最大子数组的长度,以使子数组的所有元素均为Perfect number 。
A perfect number is a positive integer that is equal to the sum of its proper divisors.
例子:
Input: arr[] = {1, 7, 36, 4, 6, 28, 4}
Output: 2
Explanation:
Maximum length sub-array with all elements as perfect number is {6, 28}.
Input: arr[] = {25, 100, 2, 3, 9, 1}
Output: 0
Explanation:
None of the number is a perfect number
方法:
- 从左到右遍历数组,并将max_length和current_length变量初始化为0。
- 如果当前元素是一个完美数字,则增加current_length变量并继续该过程。否则,将current_length设置为0。
- 在每个步骤中,将max_length分配为max_length = max(current_length,max_length) 。
- 最后打印max_length的值,因为它将存储所需的结果。
下面是上述方法的实现:
C++
// C++ program to find the length of the
// largest sub-array of an array every
// element of whose is a perfect number
#include
using namespace std;
// Function that returns true if n is perfect
bool isPerfect(long long int n)
{
// Variable to store sum of divisors
long long int sum = 1;
// Find all divisors and add them
for (long long int i = 2; i * i <= n; i++) {
if (n % i == 0) {
if (i * i != n)
sum = sum + i + n / i;
else
sum = sum + i;
}
}
// Check if sum of divisors is equal to
// n, then n is a perfect number
if (sum == n && n != 1)
return true;
return false;
}
// Function to return the length of the
// largest sub-array of an array every
// element of whose is a perfect number
int contiguousPerfectNumber(int arr[], int n)
{
int current_length = 0;
int max_length = 0;
for (int i = 0; i < n; i++) {
// Check if arr[i] is a perfect number
if (isPerfect(arr[i]))
current_length++;
else
current_length = 0;
max_length = max(max_length,
current_length);
}
return max_length;
}
// Driver code
int main()
{
int arr[] = { 1, 7, 36, 4, 6, 28, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << contiguousPerfectNumber(arr, n);
return 0;
}
Java
// Java program to find the length of the
// largest sub-array of an array every
// element of whose is a perfect number
import java.util.*;
class GFG
{
// Function that returns true if n is perfect
static boolean isPerfect(int n)
{
// Variable to store sum of divisors
int sum = 1;
int i;
// Find all divisors and add them
for ( i = 2; i * i <= n; i++) {
if (n % i == 0) {
if (i * i != n)
sum = sum + i + n / i;
else
sum = sum + i;
}
}
// Check if sum of divisors is equal to
// n, then n is a perfect number
if (sum == n && n != 1)
return true;
return false;
}
// Function to return the length of the
// largest sub-array of an array every
// element of whose is a perfect number
static int contiguousPerfectNumber(int arr[], int n)
{
int current_length = 0;
int max_length = 0;
int i;
for (i = 0; i < n; i++) {
// Check if arr[i] is a perfect number
if (isPerfect(arr[i]))
current_length++;
else
current_length = 0;
max_length = Math.max(max_length,
current_length);
}
return max_length;
}
// Driver code
public static void main(String []args)
{
int arr[] = { 1, 7, 36, 4, 6, 28, 4 };
int n = arr.length;
System.out.print(contiguousPerfectNumber(arr, n));
}
}
//This code is contributed by chitranayal
Python3
# Python 3 program to find the length of
# the largest sub-array of an array every
# element of whose is a perfect number
# Function that returns true if n is perfect
def isPerfect( n ):
# To store sum of divisors
sum = 1
# Find all divisors and add them
i = 2
while i * i <= n:
if n % i == 0:
sum = sum + i + n / i
i += 1
# check if the sum of divisors is equal to
# n, then n is a perfect number
return (True if sum == n and n != 1 else False)
# Function to return the length of the
# largest sub-array of an array every
# element of whose is a perfect number
def contiguousPerfectNumber(arr, n):
current_length = 0
max_length = 0
for i in range(0, n, 1):
# check if arr[i] is a perfect number
if (isPerfect(arr[i])):
current_length += 1
else:
current_length = 0
max_length = max(max_length,
current_length)
return max_length
# Driver code
if __name__ == '__main__':
arr = [1, 7, 36, 4, 6, 28, 4]
n = len(arr)
print(contiguousPerfectNumber(arr, n))
C#
// C# program to find the length of the
// largest sub-array of an array every
// element of whose is a perfect number
using System;
class GFG{
// Function that returns true if n is perfect
static bool isPerfect(int n)
{
// Variable to store sum of divisors
int sum = 1;
int i;
// Find all divisors and add them
for(i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
if (i * i != n)
sum = sum + i + n / i;
else
sum = sum + i;
}
}
// Check if sum of divisors is equal to
// n, then n is a perfect number
if (sum == n && n != 1)
{
return true;
}
return false;
}
// Function to return the length of the
// largest sub-array of an array every
// element of whose is a perfect number
static int contiguousPerfectNumber(int []arr,
int n)
{
int current_length = 0;
int max_length = 0;
int i;
for(i = 0; i < n; i++)
{
// Check if arr[i] is a perfect number
if (isPerfect(arr[i]))
{
current_length++;
}
else
{
current_length = 0;
}
max_length = Math.Max(max_length,
current_length);
}
return max_length;
}
// Driver code
public static void Main(String []args)
{
int []arr = { 1, 7, 36, 4, 6, 28, 4 };
int n = arr.Length;
Console.Write(contiguousPerfectNumber(arr, n));
}
}
// This code is contributed by sapnasingh4991
输出:
2
时间复杂度: O(N×√N)
辅助空间复杂度: O(1)