📌  相关文章
📜  打印所有可能的方式将N写入两个或多个正整数之和

📅  最后修改于: 2021-04-24 05:23:11             🧑  作者: Mango

给定一个整数N ,任务是打印所有可能的方式,其中N可以被写为两个或多个正整数之和。
例子:

方法:想法是使用递归来解决此问题。想法是考虑从1到N的每个整数,这样在每次递归调用时,总和N都可以减少此数字;如果在任何递归调用中,N都减少为零,那么我们将打印存储在向量中的答案。以下是递归的步骤:

  1. 获取必须将其总和分解为两个或更多个正整数的数字N。
  2. 从值1递归地迭代到N作为索引i
  • 基本情况:如果递归调用的值为0 ,则打印当前向量,因为这是将N分解为两个或多个正整数的方法之一。
if (n == 0)
    printVector(arr);



  • 递归调用:如果不满足基本条件,则从[i,N – i]递归迭代。将当前元素j推入vector(say arr )中,并递归地迭代下一个索引,在此递归结束后,弹出先前插入的元素j
for j in range[i, N]:
    arr.push_back(j);
    recursive_function(arr, j + 1, N - j);
    arr.pop_back(j);   


下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Function to print the values stored
// in vector arr
void printVector(vector& arr)
{
    if (arr.size() != 1) {
  
        // Traverse the vector arr
        for (int i = 0; i < arr.size(); i++) {
            cout << arr[i] << " ";
        }
        cout << endl;
    }
}
  
// Recursive function to print different
// ways in which N can be written as
// a sum of at 2 or more positive integers
void findWays(vector& arr, int i, int n)
{
    // If n is zero then print this
    // ways of breaking numbers
    if (n == 0)
        printVector(arr);
  
    // Start from previous element
    // in the representation till n
    for (int j = i; j <= n; j++) {
  
        // Include current element
        // from representation
        arr.push_back(j);
  
        // Call function again
        // with reduced sum
        findWays(arr, j, n - j);
  
        // Backtrack to remove current
        // element from representation
        arr.pop_back();
    }
}
  
// Driver Code
int main()
{
    // Given sum N
    int n = 4;
  
    // To store the representation
    // of breaking N
    vector arr;
  
    // Function Call
    findWays(arr, 1, n);
  
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
  
class GFG{
  
// Function to print the values stored
// in vector arr
static void printVector(ArrayList arr)
{
    if (arr.size() != 1)
    {
          
        // Traverse the vector arr
        for(int i = 0; i < arr.size(); i++)
        {
            System.out.print(arr.get(i) + " ");
        }
        System.out.println();
    }
}
  
// Recursive function to print different
// ways in which N can be written as
// a sum of at 2 or more positive integers
static void findWays(ArrayList arr, 
                     int i, int n)
{
      
    // If n is zero then print this
    // ways of breaking numbers
    if (n == 0)
        printVector(arr);
  
    // Start from previous element
    // in the representation till n
    for(int j = i; j <= n; j++) 
    {
          
        // Include current element
        // from representation
        arr.add(j);
  
        // Call function again
        // with reduced sum
        findWays(arr, j, n - j);
  
        // Backtrack to remove current
        // element from representation
        arr.remove(arr.size() - 1);
    }
}
  
// Driver code
public static void main(String[] args)
{
      
    // Given sum N
    int n = 4;
      
    // To store the representation
    // of breaking N
    ArrayList arr = new ArrayList();
      
    // Function call
    findWays(arr, 1, n);
}
}
  
// This code is contributed by offbeat


Python3
# Python3 program for the above approach
  
# Function to print the values stored
# in vector arr
def printVector(arr):
  
    if (len(arr) != 1):
  
        # Traverse the vector arr
        for i in range(len(arr)):
            print(arr[i], end = " ")
        print()    
  
# Recursive function to prdifferent
# ways in which N can be written as
# a sum of at 2 or more positive integers
def findWays(arr, i, n):
  
    # If n is zero then prthis
    # ways of breaking numbers
    if (n == 0):
        printVector(arr)
  
    # Start from previous element
    # in the representation till n
    for j in range(i, n + 1):
  
        # Include current element
        # from representation
        arr.append(j)
  
        # Call function again
        # with reduced sum
        findWays(arr, j, n - j)
  
        # Backtrack to remove current
        # element from representation
        del arr[-1]
          
# Driver Code
if __name__ == '__main__':
  
    # Given sum N
    n = 4
  
    # To store the representation
    # of breaking N
    arr = []
  
    # Function Call
    findWays(arr, 1, n)
  
# This code is contributed by mohit kumar 29


C#
// C# program for the above approach 
using System;
using System.Collections.Generic;
  
class GFG{ 
  
// Function to print the values stored 
// in vector arr 
static void printList(List arr) 
{ 
    if (arr.Count != 1) 
    { 
          
        // Traverse the vector arr 
        for(int i = 0; i < arr.Count; i++) 
        { 
            Console.Write(arr[i] + " "); 
        } 
        Console.WriteLine(); 
    } 
} 
  
// Recursive function to print different 
// ways in which N can be written as 
// a sum of at 2 or more positive integers 
static void findWays(List arr, 
                     int i, int n) 
{ 
      
    // If n is zero then print this 
    // ways of breaking numbers 
    if (n == 0) 
        printList(arr); 
  
    // Start from previous element 
    // in the representation till n 
    for(int j = i; j <= n; j++) 
    { 
          
        // Include current element 
        // from representation 
        arr.Add(j); 
  
        // Call function again 
        // with reduced sum 
        findWays(arr, j, n - j); 
  
        // Backtrack to remove current 
        // element from representation 
        arr.RemoveAt(arr.Count - 1); 
    } 
} 
  
// Driver code 
public static void Main(String[] args) 
{ 
      
    // Given sum N 
    int n = 4; 
      
    // To store the representation 
    // of breaking N 
    List arr = new List(); 
      
    // Function call 
    findWays(arr, 1, n); 
} 
} 
  
// This code is contributed by 29AjayKumar


输出:
1 1 1 1 
1 1 2 
1 3 
2 2

时间复杂度: O(2 N )
辅助空间: O(N 2 )