求组合数(适用于60内的排列组合)
long long gcd ( long long x,long long y){ if(y==0) return x>y?x:y; int t=x%y; while(t){ x=y,y=t,t=x%y; } return y; } long long C(int a,int b){ long long mu=1,zi=1; long long int n=b<a-b?b:a-b; for(int i=1,te=a;i<=n;i++,te--){ mu*=te; zi*=i; long long int temp = gcd(mu,zi); mu/=temp; zi/=temp; } return mu/zi; }
输出排列组合(从小到大)
#include <iostream> #include <vector> #include <algorithm> using namespace std; void printResult(vector<int>& vecInt, int t[]){ for(int i = 0; i < vecInt.size(); ++i) if(vecInt[i] == 1) cout << t[i] << " "; cout << endl; } bool compare(int a, int b){ if(a > b) return true; return false; } void combination(int t[], int c, int total){ vector<int> vecInt(total,0); for(int i = 0; i < c; ++i) vecInt[i] = 1; printResult(vecInt, t); for(int i = 0; i < total - 1; ++i) if(vecInt[i] == 1 && vecInt[i+1] == 0){ swap(vecInt[i], vecInt[i+1]); sort(vecInt.begin(),vecInt.begin() + i, compare); printResult(vecInt, t); i = -1; } } int main() { const int N = 5; int t[N] = {1, 2, 3, 4, 5}; combination(t, 3, N); system("pause"); return 0; }