给定一个整数n,我们需要找到一个正整数范围,以使该范围内的所有数字都是合成的,并且该范围的长度为n。如果答案不只一个,则可以打印任何范围。一个复合数字是一个正整数,它本身至少具有一个除1以外的除数(来源:wiki)
例子 :
Input : 3
Output : [122, 124]
Explanation 122, 123, 124 are all composite numbers
解决方案有点棘手。由于有许多可能的答案,因此我们在这里讨论一个广义的解决方案。
Let the length of range be n and range starts
from a then, a, a+1, a+2, ...., a+n-1 all should
be composite. So the problem boils down to finding
such 'a'.
If we closely observe p! (where p is a positive
integers) then we will find that, p! has factors of
2, 3, 4, ..., p-1,
Hence if we add i to p! such that 1 < i < p,
then p! + i has a factor i, so p! + i must be
composite. So we end up finding p! + 2, p! + 3,
.... p! + p-1 are all composite and continuous
integers forming a range [p! + 2, p! + p-1]
The above range consists of p-2 elements.
For a range of n elements we need to consider (n+2)!
If we take a = (n+2)! + 2,
Then, a + 1 = (n+2)! + 3
Then, a + 2 = (n+2)! + 4
...
Then, a + n-1 = (n+2)! + n+1
Hence,
a = (n+2)! + 2 = 2*3*....*(n+2) + 2
a has 2 as its divisor because (n+2)! and 2
both divides 2
a + 1 = 2*3*....*(n+2) + 3
a + 1 has 3 as its divisor because (n+2)!
and 3 both divides 3
...
a + n-1 = 2*3*....*(n+2) + n+1
a + n-1 has n+1 as its divisor because (n+2)!
and n+1 both divides n+1
Therefore range will be [ (n+2)! + 2, ( (n+2)! + 2 ) + n-1]
上面算法的例子
n = 3
Then a = (n+2)! + 2
a = 5! + 2
a + 1 = 5! + 3
a + 2 = 5! + 4
Here a is divisible by 2
Here a + 1 is divisible by 3
Here a + 2 is divisible by 4
Hence a, a+1, a+2 are all composites
C++
// C++ program to find a range of
// composite numbers of given length
#include
using namespace std;
// method to find factorial
// of given number
int factorial (int n)
{
if (n == 0)
return 1;
return n * factorial(n-1);
}
// to print range of length n
// having all composite integers
int printRange(int n)
{
int a = factorial(n + 2) + 2;
int b = a + n - 1;
cout << "[" << a << ", " << b << "]";
return 0;
}
// Driver method
int main()
{
int n = 3 ;
printRange(n);
return 0;
}
// This code is contributd by Anshika Goyal
Java
// Java program to find a range of composite
// numbers of given length
class Test
{
// method to find factorial of given number
static int factorial(int n)
{
if (n == 0)
return 1;
return n*factorial(n-1);
}
// to print range of length n
// having all composite integers
static void printRange(int n)
{
int a = factorial(n + 2) + 2;
int b = a + n - 1;
System.out.println("[" + a + ", " + b + "]");
}
// Driver method
public static void main(String args[]) throws Exception
{
int n = 3 ;
printRange(n);
}
}
Python
# Python program to find a range of composite
# numbers of given length
# function to calculate factorial
def factorial(n):
a = 1
for i in range(2, n + 1):
a *= i
return a
# to print range of length n
# having all composite integers
def printRange(n):
a = factorial(n + 2) + 2
b = a + n - 1
print("["+str(a)+", "+str(b)+"]")
# driver code to test above functions
n = 3
printRange(n)
C#
// C# program to find a range of
// composite numbers of given
// length
using System;
class GFG {
// method to find factorial
// of given number
static int factorial(int n)
{
if (n == 0)
return 1;
return n*factorial(n-1);
}
// to print range of length n
// having all composite integers
static void printRange(int n)
{
int a = factorial(n + 2) + 2;
int b = a + n - 1;
Console.WriteLine("[" + a +
", " + b + "]");
}
// Driver method
public static void Main()
{
int n = 3 ;
printRange(n);
}
}
// This code is contributed by anuj_67.
PHP
Javascript
输出 :
[122, 124]
以上算法分析
时间复杂度:O(n)
辅助空间:O(1)