求N个数中M个排列组合的C++代码
时间: 2023-04-02 15:05:10 浏览: 119
以下是求N个数中M个排列组合的C的代码:
#include <stdio.h>
int main() {
int n, m;
printf("请输入N和M的值:");
scanf("%d %d", &n, &m);
int c = 1;
for (int i = 1; i <= m; i++) {
c = c * (n - i + 1) / i;
}
printf("%d个数中选%d个的排列组合数为%d\n", n, m, c);
return ;
}
相关问题
用c++代码实现打印n个数中任意m个数的组合
以下是使用递归实现的C++代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
void combine(vector<int>& nums, vector<int>& temp, int start, int m) {
if (m == 0) {
// 输出当前组合
for (int i = 0; i < temp.size(); i++) {
cout << temp[i] << " ";
}
cout << endl;
return;
}
for (int i = start; i <= nums.size() - m; i++) {
temp.push_back(nums[i]);
combine(nums, temp, i + 1, m - 1);
temp.pop_back();
}
}
int main() {
int n, m;
cin >> n >> m;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
nums[i] = i + 1;
}
vector<int> temp;
combine(nums, temp, 0, m);
return 0;
}
```
该代码中,首先输入总共有n个数,需要选择m个数进行组合。然后使用一个大小为n的vector来存储所有的数,再使用一个大小为m的vector来存储当前选中的组合。接着,使用递归的方式,从start开始枚举所有可能的数字,将其加入组合中,然后继续递归,从下一个数字开始选取,直到选完m个数字为止。在选完m个数字后,输出当前组合并返回上一层递归。
需要注意的是,在每一层递归中,由于已经选取了一些数字,因此i的上限是nums.size() - m,以保证选完当前数字后,还有足够的数字可以选择。同时,在选完当前数字后,需要将其从组合中移除,以便下一次递归可以选取新的数字。
c++从n个数中任取m个数
这个问题可以使用递归实现。具体来说,我们可以从前往后枚举每一个数,对于当前枚举到的数,有两种情况:选或不选。如果选了当前的数,那么我们就需要从剩下的 n-1 个数中再选 m-1 个数;如果不选当前的数,那么我们就需要从剩下的 n-1 个数中再选 m 个数。这样就可以得到递推式:
C(n, m) = C(n-1, m-1) + C(n-1, m)
边界条件是当 m=0 或 m=n 时,C(n, m) 的值为 1。
下面是 C++ 的代码实现:
int C(int n, int m) {
if (m == 0 || m == n) {
return 1;
}
return C(n-1, m-1) + C(n-1, m);
}