老师留了一个题目:
有一个公司希望发行即开型彩票,每张彩票上有m个数字,这m个数字是从n个数字中选择出来的。要求这m个数字没有重复,每一张彩票也不能重复,请设计一个打印彩票的程序,打印彩票:
分析:
是一个很直观的题目即从n个数中任取m个数且不重复,就是排列组合中的大C计算,我的想法是用两个数组模拟
num: 装那n个数
v: 装待选取的那m个数分别对应的num的下标
上程序:
include bits/stdc++.husing namespace std;vectorint num,v;int n,m;int ans;long long Factorial(int x){ long long ans=1; for(int i=1;i=x;i++) ans*=i; return ans;}long long Check(int n,int m){ return Factorial(n)/(Factorial(m)*Factorial(n-m));}void print(){ ans++; for(int i=0;im;i++) coutnum[v[i]]' '; coutendl;}void adjust(int now){ int flag=v[now]; for(int i=now;im;i++) v[i]=++flag;}void solve(int st,int en){ if(st==en) {print(); while(++v[st]n) print();} else { while(v[st]n-1) { solve(st+1,en); adjust(st); } }}int main(){ cout"请输入n:"; cinn; cout"请输入m:"; cinm; clock_t startTime,endTime; startTime = clock();//计时开始 if(nm) { cout"输入不正确,所输入n不应该小于m!"; return 0; } for(int i=0;in;i++) num.push_back(i+1); for(int i=0;im;i++) v.push_back(i); solve(m-1,m-1); for(int i=m-2;i=0;i--) { adjust(i); solve(i,m-1); } coutansendl; endTime = clock();//计时结束 cout"The run time is: " (double)(endTime - startTime) / CLOCKS_PER_SEC "s" endl; cout"验证:"Check(n,m); return 0;}程序增加了用阶乘验证,最后用思路跑的和阶乘公式验证的结果相同,为正确;
(因为程序写的仓促望大神指正,有更好的方法欢迎评论交流~~)
小程序













