有N个元素的集合{1,2,3,……N},当N非常大时,有这样的结果:
#include <iostream> #include <cstdio> using namespace std; int p[25],n,r; void show(){ for(int i=1;i<=r;i++) printf("%3d",p[i]); puts(""); } int main() { while(cin>>n>>r){ int zi=1,mu=1,len,top; for(int i=1;i<=r;i++){ zi*=(n-i+1); mu*=i; } len=zi/mu; for(int i=1;i<=r;i++){ p[i]=i; } show(); top=r; for(int k=1;k<len;k++){ if(p[top]<n-r+top){ p[top]=p[top]+1; for(int j=top+1;j<=r;j++){ p[j]=p[j-1]+1; } show(); if(p[r]<n) top=r; } if(p[top]==n-r+top){ top--; } } //cout<<top<<endl; } return 0; }
in the lexicographic order of the r-subset of{1,2,3……n}