给定数字N。任务是打印所有可能的连续数字,这些数字加起来为N。
例子 :
Input: N = 100
Output:
9 10 11 12 13 14 15 16
18 19 20 21 22
Input: N = 125
Output:
8 9 10 11 12 13 14 15 16 17
23 24 25 26 27
62 63
一个重要的事实是,我们找不到大于N / 2的连续数字加起来等于N,因为N / 2 +(N / 2 + 1)会大于N。因此我们从start = 1到end = N / 2并检查每个连续序列是否相加N。如果是这样,我们将打印该序列,并通过增加起始点开始寻找下一个序列。
C++
// C++ program to print consecutive sequences
// that add to a given value
#include
using namespace std;
void findConsecutive(int N)
{
// Note that we don't ever have to sum
// numbers > ceil(N/2)
int start = 1, end = (N+1)/2;
// Repeat the loop from bottom to half
while (start < end)
{
// Check if there exist any sequence
// from bottom to half which adds up to N
int sum = 0;
for (int i = start; i <= end; i++)
{
sum = sum + i;
// If sum = N, this means consecutive
// sequence exists
if (sum == N)
{
// found consecutive numbers! print them
for (int j = start; j <= i; j++)
printf("%d ", j);
printf("\n");
break;
}
// if sum increases N then it can not exist
// in the consecutive sequence starting from
// bottom
if (sum > N)
break;
}
sum = 0;
start++;
}
}
// Driver code
int main(void)
{
int N = 125;
findConsecutive(N);
return 0;
}
Java
// Java program to print
// consecutive sequences
// that add to a given value
import java.io.*;
class GFG
{
static void findConsecutive(int N)
{
// Note that we don't
// ever have to sum
// numbers > ceil(N/2)
int start = 1;
int end = (N + 1) / 2;
// Repeat the loop
// from bottom to half
while (start < end)
{
// Check if there exist
// any sequence from
// bottom to half which
// adds up to N
int sum = 0;
for (int i = start; i <= end; i++)
{
sum = sum + i;
// If sum = N, this means
// consecutive sequence exists
if (sum == N)
{
// found consecutive
// numbers! print them
for (int j = start; j <= i; j++)
System.out.print(j + " ");
System.out.println();
break;
}
// if sum increases N then
// it can not exist in the
// consecutive sequence
// starting from bottom
if (sum > N)
break;
}
sum = 0;
start++;
}
}
// Driver code
public static void main (String[] args)
{
int N = 125;
findConsecutive(N);
}
}
// This code is contributed by m_kit
Python3
# Python3 program to print consecutive
# sequences that add to a given value
def findConsecutive(N):
# Note that we don't ever have to
# Sum numbers > ceil(N/2)
start = 1
end = (N + 1) // 2
# Repeat the loop from bottom to half
while (start < end):
# Check if there exist any sequence
# from bottom to half which adds up to N
Sum = 0
for i in range(start, end + 1):
Sum = Sum + i
# If Sum = N, this means consecutive
# sequence exists
if (Sum == N):
# found consecutive numbers! prthem
for j in range(start, i + 1):
print(j, end = " ")
print()
break
# if Sum increases N then it can not
# exist in the consecutive sequence
# starting from bottom
if (Sum > N):
break
Sum = 0
start += 1
# Driver code
N = 125
findConsecutive(N)
# This code is contributed by Mohit kumar 29
C#
// C# program to print
// consecutive sequences
// that add to a given value
using System;
class GFG
{
static void findConsecutive(int N)
{
// Note that we don't
// ever have to sum
// numbers > ceil(N/2)
int start = 1;
int end = (N + 1) / 2;
// Repeat the loop
// from bottom to half
while (start < end)
{
// Check if there exist
// any sequence from
// bottom to half which
// adds up to N
int sum = 0;
for (int i = start; i <= end; i++)
{
sum = sum + i;
// If sum = N, this means
// consecutive sequence exists
if (sum == N)
{
// found consecutive
// numbers! print them
for (int j = start; j <= i; j++)
Console.Write(j + " ");
Console.WriteLine();
break;
}
// if sum increases N then
// it can not exist in the
// consecutive sequence
// starting from bottom
if (sum > N)
break;
}
sum = 0;
start++;
}
}
// Driver code
static public void Main ()
{
int N = 125;
findConsecutive(N);
}
}
// This code is contributed by ajit
PHP
ceil(N/2)
$start = 1;
$end = ($N + 1) / 2;
// Repeat the loop from
// bottom to half
while ($start < $end)
{
// Check if there exist any
// sequence from bottom to
// half which adds up to N
$sum = 0;
for ($i = $start; $i <= $end; $i++)
{
$sum = $sum + $i;
// If sum = N, this means
// consecutive sequence exists
if ($sum == $N)
{
// found consecutive
// numbers! print them
for ($j = $start; $j <= $i; $j++)
echo $j ," ";
echo "\n";
break;
}
// if sum increases N then it
// can not exist in the consecutive
// sequence starting from bottom
if ($sum > $N)
break;
}
$sum = 0;
$start++;
}
}
// Driver code
$N = 125;
findConsecutive($N);
// This code is contributed by ajit
?>
C++
#include
using namespace std;
int main() {
cout<<"GFG!";
return 0;
}
Javascript
C++
// Optimized C++ program to find sequences of all consecutive
// numbers with sum equal to N
#include
void printSums(int N)
{
int start = 1, end = 1;
int sum = 1;
while (start <= N/2)
{
if (sum < N)
{
end += 1;
sum += end;
}
else if (sum > N)
{
sum -= start;
start += 1;
}
else if (sum == N)
{
for (int i = start; i <= end; ++i)
printf("%d ", i);
printf("\n");
sum -= start;
start += 1;
}
}
}
// Driver Code
int main()
{
printSums(125);
return 0;
}
Java
// Optimized Java program to find
// sequences of all consecutive
// numbers with sum equal to N
import java.io.*;
class GFG {
static void printSums(int N)
{
int start = 1, end = 1;
int sum = 1;
while (start <= N/2)
{
if (sum < N)
{
end += 1;
sum += end;
}
else if (sum > N)
{
sum -= start;
start += 1;
}
else if (sum == N)
{
for (int i = start;
i <= end; ++i)
System.out.print(i
+ " ");
System.out.println();
sum -= start;
start += 1;
}
}
}
// Driver Code
public static void main (String[] args)
{
printSums(125);
}
}
// This code is contributed by anuj_67.
Python3
# Optimized Python3 program to find sequences of all consecutive
# numbers with sum equal to N
def findConsecutive(N):
start = 1
end = 1
sum = 1
while start <= N/2:
if sum < N:
end += 1
sum += end
if sum > N:
sum -= start
start += 1
if sum == N:
for i in range(start, end + 1):
print(i, end=' ')
print( )
sum -= start
start += 1
# Driver code
N = 125
findConsecutive(N)
# This code is contributed by Sanskriti Agrawal
C#
// Optimized C# program to find
// sequences of all consecutive
// numbers with sum equal to N
using System;
class GFG {
static void printSums(int N)
{
int start = 1, end = 1;
int sum = 1;
while (start <= N/2)
{
if (sum < N)
{
end += 1;
sum += end;
}
else if (sum > N)
{
sum -= start;
start += 1;
}
else if (sum == N)
{
for (int i = start;
i <= end; ++i)
Console.Write(i
+ " ");
Console.WriteLine();
sum -= start;
start += 1;
}
}
}
// Driver Code
public static void Main ()
{
printSums(125);
}
}
// This code is contributed by anuj_67.
PHP
$N)
{
$sum -= $start;
$start += 1;
}
else if ($sum == $N)
{
for ($i = $start; $i <= $end; ++$i)
echo $i," ";
echo "\n";
$sum -= $start;
$start += 1;
}
}
}
// Driver Code
printSums(125);
// This code is contributed by jit_t
?>
Javascript
输出 :
8 9 10 11 12 13 14 15 16 17
23 24 25 26 27
62 63
优化的解决方案:
在上述解决方案中,我们一直在重新计算总和,这导致O(N ^ 2)最坏情况下的时间复杂度。可以通过使用预先计算的总和数组或更好的方法来避免这种情况-只需跟踪到目前为止的总和,然后根据它与所需总和的比较方式进行调整即可。
以下代码的时间复杂度为O(N)。
C++
// Optimized C++ program to find sequences of all consecutive
// numbers with sum equal to N
#include
void printSums(int N)
{
int start = 1, end = 1;
int sum = 1;
while (start <= N/2)
{
if (sum < N)
{
end += 1;
sum += end;
}
else if (sum > N)
{
sum -= start;
start += 1;
}
else if (sum == N)
{
for (int i = start; i <= end; ++i)
printf("%d ", i);
printf("\n");
sum -= start;
start += 1;
}
}
}
// Driver Code
int main()
{
printSums(125);
return 0;
}
Java
// Optimized Java program to find
// sequences of all consecutive
// numbers with sum equal to N
import java.io.*;
class GFG {
static void printSums(int N)
{
int start = 1, end = 1;
int sum = 1;
while (start <= N/2)
{
if (sum < N)
{
end += 1;
sum += end;
}
else if (sum > N)
{
sum -= start;
start += 1;
}
else if (sum == N)
{
for (int i = start;
i <= end; ++i)
System.out.print(i
+ " ");
System.out.println();
sum -= start;
start += 1;
}
}
}
// Driver Code
public static void main (String[] args)
{
printSums(125);
}
}
// This code is contributed by anuj_67.
Python3
# Optimized Python3 program to find sequences of all consecutive
# numbers with sum equal to N
def findConsecutive(N):
start = 1
end = 1
sum = 1
while start <= N/2:
if sum < N:
end += 1
sum += end
if sum > N:
sum -= start
start += 1
if sum == N:
for i in range(start, end + 1):
print(i, end=' ')
print( )
sum -= start
start += 1
# Driver code
N = 125
findConsecutive(N)
# This code is contributed by Sanskriti Agrawal
C#
// Optimized C# program to find
// sequences of all consecutive
// numbers with sum equal to N
using System;
class GFG {
static void printSums(int N)
{
int start = 1, end = 1;
int sum = 1;
while (start <= N/2)
{
if (sum < N)
{
end += 1;
sum += end;
}
else if (sum > N)
{
sum -= start;
start += 1;
}
else if (sum == N)
{
for (int i = start;
i <= end; ++i)
Console.Write(i
+ " ");
Console.WriteLine();
sum -= start;
start += 1;
}
}
}
// Driver Code
public static void Main ()
{
printSums(125);
}
}
// This code is contributed by anuj_67.
的PHP
$N)
{
$sum -= $start;
$start += 1;
}
else if ($sum == $N)
{
for ($i = $start; $i <= $end; ++$i)
echo $i," ";
echo "\n";
$sum -= $start;
$start += 1;
}
}
}
// Driver Code
printSums(125);
// This code is contributed by jit_t
?>
Java脚本
输出 :
8 9 10 11 12 13 14 15 16 17
23 24 25 26 27
62 63