微信小程序> 一个小组合数程序:即开型彩票

一个小组合数程序:即开型彩票

浏览量:2037 时间: 来源:XLacon

老师留了一个题目:

有一个公司希望发行即开型彩票,每张彩票上有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;}

程序增加了用阶乘验证,最后用思路跑的和阶乘公式验证的结果相同,为正确;

(因为程序写的仓促望大神指正,有更好的方法欢迎评论交流~~)

小程序

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎