📌  相关文章
📜  打印总和为N的所有可能的连续数字

📅  最后修改于: 2021-05-06 23:31:00             🧑  作者: Mango

给定数字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