在1到100个数中,找出所有10个不同的数的任意组合

yigouxinyue007 2008-03-19 07:40:59
在1到100个数中,找出所有10个不同的数的任意组合

如何快速的求解?
...全文
399 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
oakfire 2008-03-20
  • 打赏
  • 举报
回复
有现成的公式便优先考虑实现公式,别装牛角尖了
laolaoliu2002 2008-03-20
  • 打赏
  • 举报
回复
先排序(目的:删除重复的),然后直接计算就可以了,公式都是现成的.
lyle3 2008-03-20
  • 打赏
  • 举报
回复
ls厉害~
medie2005 2008-03-20
  • 打赏
  • 举报
回复
下面这个lz可以参考一下
#include   <windows.h>
#include <iostream>
#include <iterator>

using namespace std;

void combination( int n, int m ){
int *c=new int[m+2], j;
for( j=1; j<=m; ++j ) c[j]=j-1;
c[m+1]=n;
R2: ;//copy( c+1, c+m+1, ostream_iterator<int>(cout," ") ),cout<<endl;
if( m&1 )
if( c[1]+1<c[2] ){
++c[1]; goto R2;
}
else{
j=2; goto R4;
}
else
if( c[1]>0 ){
--c[1]; goto R2;
}
else{
j=2; goto R5;
};
R4: if( c[j]>=j ){
c[j]=c[j-1]; c[j-1]=j-2; goto R2;
}
else
++j;
R5: if( c[j]+1<c[j+1] ){
c[j-1]=c[j]; c[j]=c[j]+1; goto R2;
}
else{
++j;
if( j<=m ) goto R4;
}
delete []c;
}

int main(int argc, char *argv[])
{
int time=GetTickCount();
combination( 50, 10 );
cout<<GetTickCount()-time<<" ms\n";
return 0;
}
mathe 2008-03-20
  • 打赏
  • 举报
回复
上面代码(50个数选10个)如果不输出,在我的Linux上需要运行28秒,所以如果改成运行100个数选10个,估计需要运行13小时。
如果要输出所有组合,那就麻烦了,储存空间是个大问题
mathe 2008-03-20
  • 打赏
  • 举报
回复
上面代码有错,修改一下

#include <stdio.h>
#define N 50
#define M 10

long long count;
void output(int index[])
{
#ifdef OUTPUT_DATA
int i;
for(i=0;i<M-1;i++){
printf("%d,",index[i]);
}
printf("%d\n",index[i]);
#endif
count++;
}

int main()
{
int index[M];
int i,j;
for(i=1;i<M;i++)index[i]=i+1;
do{
for(j=1;j<index[1];j++){
index[0]=j;
output(index);
}
for(j=1;j<M-1;j++){
if(index[j+1]-index[j]>1)break;
}
index[j]++;
for(i=1;i<j;i++)index[i]=i+1;
}while(j<M-1||index[M-1]<=N);
printf("Total %lld\n",count);
return 0;
}

mathe 2008-03-20
  • 打赏
  • 举报
回复
下面这个版本速度应该还可以。但是总数量太多,还是要花很长时间的。

int index[10];
int i,j;
for(i=1;i<10;i++)index[i]=i+1;
do{
for(j=1;j<index[1];j++){
index[0]=j;
output(index);
}
for(j=1;j<9;j++){
if(index[j+1]-index[j]>1)break;
index[j]++;
}
if(j==9){
index[9]++;
if(index[9]>100)break;
}
}while(1);
sdyqingdao 2008-03-20
  • 打赏
  • 举报
回复
贪婪算法
Dogfish 2008-03-20
  • 打赏
  • 举报
回复
会很慢的。
C(100,10)=100!/(10!*90!)=17,310,309,456,440
yigouxinyue007 2008-03-19
  • 打赏
  • 举报
回复
大牛
野男孩 2008-03-19
  • 打赏
  • 举报
回复
总共有100*99*98*97*96*95*94*94*92*91/(1*2*3*4*5*6*7*8*9*10)这么多个!!

用递归的思想是最直接的,从小到大的顺序,100个数中选10个,先选中1,然后在剩下的99个数中选9个。99选9的方法就跟刚才100选10的方法一样,先选最小的,最小的是2了,然后再从98个中选8个。最后是90个选1个。然后回溯!



#include <stdio.h>

#define MAX_N 100

int g_arr[MAX_N] = {0};
__int64 g_cnt = 0;

void Recur(int* arr, int arr_size, int req_cnt)
{
if (req_cnt > 0)
{
//数据没有选够,从剩下的数据中继续选

//先选中最小的
arr[0] = 1;
//然后从剩下的arr_size - 1个数据中选req_cnt-1个数据
Recur(arr+1, arr_size - 1, req_cnt-1);

//回溯一下,跳过刚才选的那个最小数的情况
arr[0] = 0;
if ((arr_size - 1) >= (req_cnt ))
{
Recur(arr+1, arr_size - 1, req_cnt);
}
}
else
{
//找到一组完整数据
++g_cnt;

//输出组合
for(int i=0; i<MAX_N; i++)
{
if (g_arr[i] == 1)
{
printf("%d\t", i);
}
}
printf("\n");
}
}

int main(int argc, char* argv[])
{
Recur(g_arr, MAX_N, 5);

printf("total group = %I64u\n", g_cnt);
return 0;
}



100选10,规模太大,100选5时,total group = 75287520
fosjos 2008-03-19
  • 打赏
  • 举报
回复
搜一段排列组合的代码,然后把100和10代入
shark003 2008-03-19
  • 打赏
  • 举报
回复
遍历
go实战微服务分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。在一个分布式系统,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。系统存在一个以全局的方式管理计算机资源的分布式操作系统。通常,对用户来说,分布式系统只有一个模型或范型。在操作系统之上有一层软件间件(middleware)负责实现这个模型。一个著名的分布式系统的例子是万维网(World Wide Web),在万维网,所有的一切看起来就好像是一个文档(Web页面)一样。 [1] 在计算机网络,这种统一性、模型以及其的软件都不存在。用户看到的是实际的机器,计算机网络并没有使这些机器看起来是统一的。如果这些机器有不同的硬件或者不同的操作系统,那么,这些差异对于用户来说都是完全可见的。如果一个用户希望在一台远程机器上运行一个程序,那么,他必须登陆到远程机器上,然后在那台机器上运行该程序。 [1] 分布式系统和计算机网络系统的共同点是:多分布式系统是建立在计算机网络之上的,所以分布式系统与计算机网络在物理结构上是基本相同的。 [1] 他们的区别在于:分布式操作系统的设计思想和网络操作系统是不同的,这决定了他们在结构、工作方式和功能上也不同。网络操作系统要求网络用户在使用网络资源时首先必须了解网络资源,网络用户必须知道网络各个计算机的功能与配置、软件资源、网络文件结构等情况,在网络如果用户要读一个共享文件时,用户必须知道这个文件放在哪一台计算机的哪一个目录下;分布式操作系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。当用户提交一个作业时,分布式操作系统能够根据需要在系统选择最合适的处理器,将用户的作业提交到该处理程序,在处理器完成作业后,将结果传给用户。在这个过程,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。 [1] 内聚性是指每一据库分布节点高度自治,有本地的据库管理系统。透明性是指每一据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。在分布式据库系统,用户感觉不到据是分布的,即用户不须知道关系是否分割、有无副本、据存于哪个站点以及事务在哪个站点上执行等。  什么是微服务?维基上对其定义为:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,将应用程序构造为一组松散耦合的服务。在微服务体系结构,服务是细粒度的,协议是轻量级的。微服务(或微服务架构)是一种云原生架构方法,其单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。这些服务通常● 有自己的堆栈,包括据库和据模型;● 通过REST API,事件流和消息代理的组合相互通信;● 和它们是按业务能力组织的,分隔服务的线通常称为有界上下文。尽管有关微服务的许多讨论都围绕体系结构定义和特征展开,但它们的价值可以通过相当简单的业务和组织收益更普遍地理解:● 可以更轻松地更新代码。● 团队可以为不同的组件使用不同的堆栈。● 组件可以彼此独立地进行缩放,从而减少了因必须缩放整个应用程序而产生的浪费和成本,因为单个功能可能面临过多的负载。 
根据区块链网络心化程度的不同,分化出3种不同应用场景下的区块链:(1)全网公开,无用户授权机制的区块链,称为公有链;(2)允许授权的节点加入网络,可根据权限查看信息,往往被用于机构间的区块链,称为联盟链或行业链;(3)所有网络的节点都掌握在一家机构手,称为私有链。联盟链和私有链也统称为许可链,公有链称为非许可链。 公有区块链系统 公有链,任何节点无须任何许可便可随时加入或脱离网络。从最早的比特币系统人手介绍公有链系统的发展现状。点对点电子现金系统:比特币与传统分布式系统的C/S , B/S或三层架构不同,比特币系统基于P2P网络,所有节点对等,且都运行同样的节点程序。节点程序总体上分为两部分:一部分是前台程序,包括钱包或图形化界面;另一部分是后台程序,包括挖矿、区块链管理、脚本引擎及网络管理等。区块链管理:涉及初始区块链下载、连接区块、断开区块、校验区块和保存区块,以及发现最长链条的顶区块。内存池管理:即交易池管理。节点将通过验证的交易放在一个交易池,并准备好将其放入下一步挖到的区块。邻接点管理:当一个新比特币节点初始启动时,它需要发现网络的其他节点,并与至少一个节点连接。共识管理:比特币的共识管理包括挖矿、区块验证和交易验证规则。比特币采用PoW共识机制,依赖机器进行哈希运算来获取记账权,同时每次达成共识需要全网共同参与运算,允许全网50%节点出错。密码模块:比特币采用RIMEMD和SHA-256算法及Base-58编码生成比特币地址。签名模块:比特币采用椭圆曲线secp256k1及字签名算法ECDSA来实现字签名并生成公钥。脚本引擎:比特币的脚本语言是一种基于堆栈的编程脚本,共有256个指令,是非图灵完备的运算平台,没有能力计算任意带复杂功能的任务。本课程从零到一带领你实践一个小型公链。  
 根据区块链网络心化程度的不同,分化出3种不同应用场景下的区块链:(1)全网公开,无用户授权机制的区块链,称为公有链;(2)允许授权的节点加入网络,可根据权限查看信息,往往被用于机构间的区块链,称为联盟链或行业链;(3)所有网络的节点都掌握在一家机构手,称为私有链。联盟链和私有链也统称为许可链,公有链称为非许可链。  公有区块链系统 公有链,任何节点无须任何许可便可随时加入或脱离网络。从最早的比特币系统人手介绍公有链系统的发展现状。 点对点电子现金系统:比特币与传统分布式系统的C/S , B/S或三层架构不同,比特币系统基于P2P网络,所有节点对等,且都运行同样的节点程序。节点程序总体上分为两部分:一部分是前台程序,包括钱包或图形化界面;另一部分是后台程序,包括挖矿、区块链管理、脚本引擎及网络管理等。区块链管理:涉及初始区块链下载、连接区块、断开区块、校验区块和保存区块,以及发现最长链条的顶区块。内存池管理:即交易池管理。节点将通过验证的交易放在一个交易池,并准备好将其放入下一步挖到的区块。邻接点管理:当一个新比特币节点初始启动时,它需要发现网络的其他节点,并与至少一个节点连接。共识管理:比特币的共识管理包括挖矿、区块验证和交易验证规则。比特币采用PoW共识机制,依赖机器进行哈希运算来获取记账权,同时每次达成共识需要全网共同参与运算,允许全网50%节点出错。密码模块:比特币采用RIMEMD和SHA-256算法及Base-58编码生成比特币地址。签名模块:比特币采用椭圆曲线secp256k1及字签名算法ECDSA来实现字签名并生成公钥。脚本引擎:比特币的脚本语言是一种基于堆栈的编程脚本,共有256个指令,是非图灵完备的运算平台,没有能力计算任意带复杂功能的任务。本课程从零到一带领你实践一个小型公链。。
通过该课程的学习,掌握0行代码写服务框架的服务发布,参验证,代码生成功能,具备初步的使用能力 该项目本身设计的内容非常多,后期会逐步开放讲解框架后期内容参考:https://mp.csdn.net/editor/html/112142371与Springboot+mybatis和Springboot+jdbctemplate对比:https://editor.csdn.net/md/?articleId=106091083框架主要功能:生成自定义sql模板文件1.一键生成据库所有列表增、删、改、查接口通过代码生成器,一键生成增、删、改、查代码,分为有代码和无代码两种方式。有代码方式可以在需要业务封装时直接调用生成的代码进行业务组装。有代码方式和无代码方式都可以直接调用访问。2.可指定单表生成接口可以指定生成那张表的据接口,以免对已有接口造成影响。3.一键生成接口测试postman调用文件生成postman调用接口,直接导入即可测试,不需要单独也写接口文档,也不需要使用swangger在代码单独增加注释。字段长度类型,大小一目了然。4.可生成controller、service、dao、model、自定义sql、postman测试文件可以根据实际需要进行单独配置5.接口任意可自动配置多维度验证比如一个参phone,在不需要编程的情况下,可以配置验证是否为空、长度、是否是电话号码6.据接口可以任意组合形成新的接口比如、查询学校是一个接口、查询城市是一个接口,通常情况下在前端是需要两次请求,现在可以通过一次请求自动合并两个接口的据结果,一次性返回。而这样的组合可以是无限个组合。7.所有接口参均可自动封装比如查询省份接口,里面有10个,前端传入几个参,便可自动封装几个参。8.所有查询接口自带分页列表查询,有码方式和无码方式,均自带分页。9.通过简单sql的编辑即可完成服务发布只要会写sql便可生成服务,不需要任何多余操作10.接口可以进行限流配置,可以根据ip、token、ak进行限流操作多维度自定义限流,可设置次、时限、限流方式11.所有接口可以进行签名认证所有接口通过接口sign签名认证12.所有接口可以进行登录认证限制,也可单独配置不需要登录认证可以指定接口单独授权不需要登录验证,比如验证码接口13.所有接口均可设置需要验证码验证所有的接口都可以通过参配置设置短信验证码和图片验证码14.所有查询接口均可单独设置缓存所有接口皆可设置单独缓存,缓存周期15.所有接口均可监控访问次同一接口访问次记录,很容易监控服务访问,可以做更细致的服务优化16.所有接口均可记录访问日志,包括请求来源请求参、获得结果入参出参所有访问皆有详细记录17.项目的代码可以进行自动统计代码量一键统计代码量,包括前后端代码行和体积18.可以自动进行据统计,可配置单表据量统计、也可以配置定时任务据统计自动表据统计,方便做BI可视化报表,不需要开发直接配置即可19.可进行跨域设置跨域通过配置文件配置20.可进行IP禁用对于恶意访问ip进行封禁21.可进行访问次限制所有接口可以进行访问次限制22.可进行访问来源设备、应用检查验证验证请求来源所用设备和请求发起的应用

64,849

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧