C++ 中打印所有给定长度的序列


在这个问题中,我们给定两个整数值 k 和 n。我们必须按排序顺序打印从 1 到 n 的数字中长度为 k 的所有序列。

让我们举个例子来理解这个主题:

Input:k = 2 ; n = 3
Output:
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

所以在这个问题中,我们必须按上述方式打印序列。

解决这个问题的一个简单方法是递增序列的整数,直到它们达到最大值 n。以下是解决方案的详细说明。

算法

1) Create an array of size k with all values = 1 i.e. {1, 1, ..ktimes}.
2) Repeat step 3 and 4 till the array becomes {n, n, …, n}.
3) Print the array.
4) Increment the value such that the elements of the array become the next value. For example, {1, 1, 1} incremented to {1, 1, 2} and {1, 3, 3} incremented to {2, 1, 1}. For this we need to check the kth element of the array, if it’s equal to n become update, then check k-1 element in the sequence and so on for the same condition.

示例

下面的程序将使这个概念对你更加清晰。

 在线演示

#include<iostream>
using namespace std;
void printSequence(int arr[], int size){
   for(int i = 0; i < size; i++)
      cout<<arr[i]<<"\t";
   cout<<endl;
   return;
}
int nextElement(int arr[], int k, int n){
   int s = k - 1;
   while (arr[s] == n)
      s--;
   if (s < 0)
      return 0;
   arr[s] = arr[s] + 1;
   for(int i = s + 1; i < k; i++)
      arr[i] = 1;
   return 1;
}
void generateSequence(int n, int k){
   int *arr = new int[k];
   for(int i = 0; i < k; i++)
      arr[i] = 1;
   while(1){
      printSequence(arr, k);
   if(nextElement(arr, k, n) == 0)
      break;
   }
   return;
}
int main(){
   int n = 3;
   int k = 2;
   cout<<"The sequence is :\n";
   generateSequence(n, k);
   return 0;
}

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

输出

序列是:

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

这种方法易于理解,但可以改进并提高效率。

此方法使用递归和一个额外的索引来检查序列偏移量(序列翻转后的值)。该函数将被递归调用,并且在索引之前不会更新项。并在索引之后递归调用函数以处理后续项。

示例

 在线演示

#include<iostream>
using namespace std;
void printSequence (int arr[], int size){
   for (int i = 0; i < size; i++)
      cout << arr[i] << "\t";
   cout << endl;
   return;
}
void generateSequence (int arr[], int n, int k, int index){
   int i;
   if (k == 0){
      printSequence (arr, index);
   }
   if (k > 0){
      for (i = 1; i <= n; ++i){
         arr[index] = i;
         generateSequence (arr, n, k - 1, index + 1);
      }
   }
}
int main (){
   int n = 3;
   int k = 2;
   int *arr = new int[k];
   cout<<"The sequence is:\n";
   generateSequence (arr, n, k, 0);
   return 0;
}

输出

序列是:

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

更新于:2020年1月17日

653 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告