问个C语言计算题,看下谁的轮转调度算法计算题效益更高

64位机器环境下,C语言超过2^64的数的运算怎么处理好的,有谁有好的算法或想法呢?_百度知道
64位机器环境下,C语言超过2^64的数的运算怎么处理好的,有谁有好的算法或想法呢?
我有更好的答案
写高精。。。用数组来存储大数,计算方法就和我们平常算加减乘除一样
采纳率:48%
为您推荐:
其他类似问题
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。面试云计算岗位时最常遇到的40个问题
1)使用云计算有哪些优点?
使用云计算有下列优点:
a)备份数据和存储数据
b)强大的服务器功能
c)SaaS(软件即服务)
d)信息技术沙盒功能
e)提高生产力
f)具有成本效益,并节省时间
2)可否列举哪些平台用于大规模云计算?
用于大规模云计算的平台包括:
a) Apache Hadoop
b) MapReduce
3)可否解释用于云计算部署的不同模式?
不同的云计算部署模式包括:
4)云计算与移动计算有何区别?
移动计算使用与云计算同样的概念。借助互联网而不是借助单个设备,云计算因数据而变得活跃。它为用户提供了需要按需获取的数据。在移动计算中,应用程序在远程服务器上运行,为用户提供了访问所存储数据的权限。
5)用户如何得益于公用计算(utility computing)?
公用计算让用户可以只需要为使用的资源付费。它是由决定从云端部署哪种类型的服务的企业组织管理的一种插件。
大多数企业组织青睐混合策略。
6)由于数据在云端传输,你如何确保数据安全?
数据从一个地方传输到另一地方的过程中想确保数据安全,就要确保针对你发送的数据所使用的加密密钥没有泄露。
7)云在安全方面的措施有哪些?
a)身份管理:授权应用程序服务。
b)访问控制:将权限授予用户,那样用户可以控制进入到云环境的另一个用户的访问。
c)验证和授权:只允许通过授权和验证的用户访问数据和应用程序。
8)可否列出定义云架构的不同层?
8)云架构使用的不同层包括:
a)CLC即云控制器
c)集群控制器
d)SC即存储控制器
e)NC即节点控制器
9)云计算系统集成商的角色是什么?
在云计算中,系统集成商负责为用来设计云平台的复杂过程制定策略。集成商需要构建更准确的混合云和私有云网络,因为集成商拥有数据中心构建方面的全部知识。
10)“EUCALYPTUS”的全称是什么?
“EUCALYPTUS”的全称是将你的程序连接到实用系统的弹性公用计算架构。
11)可否解释“EUCALYPTUS”在云计算中有何用处?
Eucalyptus是云计算中的一种开源软件基础设施,它用来将集群实施到云计算平台上。它用来构建公共云、混合云和私有云。它能够将你自己的数据中心打造成私有云,并让你可以将其功能应用于其他许多企业组织。
12)虚拟化平台在实施云时有何要求?
虚拟化平台在实施云时的要求包括:
a)管理服务级别策略
b)云操作系统
c)虚拟化平台有助于让后端级别概念和用户级别概念彼此不同。
13)在使用云计算平台前,用户需要考虑哪些必要的方面?
b)数据丢失
c)数据存储
d)业务连续性
e)正常运行时间
f)云计算的数据完整性
14)可否列举几个开源云计算平台数据库?
开源云计算平台数据库有:
a) MongoDB
b) CouchDB
c) LucidDB
15) 落实了哪些安全法规来保护云端数据的安全?
为保护云端数据安全而落实的安全法规包括:
a)处理:控制在应用程序中正确、完整处理的数据。
b)文件:它管理和控制任何文件中处理的数据。
c)输出调和:它控制输入和输出之间需要调和的数据。
d)输入验证:控制输入数据。
e)安全和备份:它提供安全和备份,还控制安全泄密日志。
16)可否列举几个大型云提供商的数据库名称?
a)Google bigtable
b)Amazon simpleDB
c)基于云的SQL
17)可否解释云与传统数据中心之间的区别?
a)由于供暖和硬件/软件问题,传统数据中心的成本比较高。
b)需求增加时,云可以扩增资源。大部分开支花在了数据中心的维护上,而云计算不是这样。
18)可否解释软件即服务(SaaS)的不同模式?
a)简单的多租户模式:在该模式中,每个用户有独立的资源,与其他用户分开来,这是一种高效的模式。
b)细粒度的多租户模式:在这种模式中,资源由许多租户共享,但是功能仍然一样。
19)API在云服务中有何用途?
API(应用编程接口)在云平台中非常有用
a)不需要编写功能完备的程序。
b)提供了在一个或多个应用程序之间进行联系的指令。
c)易于构建应用程序,并将云服务与其他系统联系起来。
20)为云计算部署了哪些不同的数据中心?
云计算包括不同的数据中心,比如
a)容器化数据中心
b)低密度数据中心
21)云计算中有哪些不同的层?
云计算的不同层包括:
a)SaaS:软件即服务,它让用户可以直接访问云应用程序,不必在系统上安装任何东西。
b)IaaS:基础设施即服务,它从硬件(比如内存和处理器速度等)等层面提供了基础设施。
c)PaaS:平台即服务,它为开发人员提供了云应用程序平台。
22)平台即服务有多重要?
平台即服务(PAAS)是云计算中一个很重要的层。它为提供商提供了应用程序平台。它负责提供基础设施层的全面虚拟化,让它运行起来如同单一的服务器。
23)云服务是什么?
云服务用来通过互联网,使用网络中的服务器来构建云应用程序。它提供了这种便利:不必将云应用程序安装到计算机上,即可直接使用。它还减少了维护和支持使用云服务开发的应用程序的工作。
24)可否列出云计算领域的三种基本云?
C)高性能云
25)就基础设施即服务而言,它提供了什么资源?
IAAS(基础设施即服务)提供了用来构建云的虚拟资源和物理资源。它负责处理部署和维护这一层提供的服务带来的复杂性。在这里,基础设施是服务器、存储系统及其他硬件系统。
26)云架构有什么样的业务好处?
云架构具有的好处包括:
a)无需基础设施投入
b)适时的基础设施
c)更高效地利用资源
27)云架构有别于传统架构的特点有哪些?
让云架构有别于传统架构的特点包括:
a)按照需求,云架构满足硬件要求。
b)云架构能够按需增减资源。
c)云架构能够管理和处理动态工作负载,顺畅无阻。
28)可否列举云计算中弹性与可扩展性的区别?
可扩展性是云计算的一个特点;借助可扩展性,只要相应增加资源容量,就可以处理增加的工作负载。作为云计算的另一个特点,弹性强调了启用和停用庞大的资源容量这一概念。
29)可否列举由Window Azure操作系统提供的服务?
Window Azure提供了三种核心服务,包括:
a)计算服务
b)存储服务
c)管理服务
30)在云架构中,必需的不同部分有哪些?
b)处理器速度
c)云存储服务
d)云提供商服务
e)云间通信
31)在云架构中,经历的不同阶段有哪些?
a)启动阶段
b)监测阶段
c)关闭阶段
d)清理阶段
32)可否列出云计算的基本特点?
a)弹性和可扩展性
b)自助式配置和自动取消配置
c)标准化界面
d)自助计费的使用模式
33)在云架构中,基本的构建模块有哪些?
a)参考架构
b)技术架构
c)部署操作架构
34)可否描述云架构以哪些方式来提供自动化和性能透明度?
为了提供性能透明度和自动化,云架构使用许多工具。它可以管理云架构和监测报告。它还可以共享使用云架构的应用程序。自动化是云架构的关键部分,有助于改善质量级别。
35)可否解释一下高性能云在云计算中的角色?
高性能云在立即传输最大数量的数据方面很有用。从事高性能计算研究的专业人员经常使用高性能云。
36)可否解释混合云和社区云?
混合云:混合云包括多家服务提供商。它结合了公共云和私有云的功能。公司同时需要私有云和公共云时,就会使用混合云。
社区云:这种模式的成本相当高;多家企业组织有着共同的目标和需求,又准备共享云服务的优点时,就会使用社区云。
37)在云中,优化策略有哪些?
为了克服维护成本,并且优化资源,用到云端三个数据中心这个概念:提供恢复和备份机制,万一出现灾难或系统故障,可确保所有数据安全无恙。
38)亚马逊SQS是什么东东?
为了在不同的连接件之间联系,就要使用亚马逊SQS消息;它在亚马逊的不同组件中充当“联络者”。
39)缓冲器如何用于亚马逊网络服务?
为了让系统更高效地应对流量或负载突增的情况,提供商使用缓冲器。缓冲器可同步不同的组件。组件始终以一种不平衡的方式接收和处理请求。不同组件之间的平衡由缓冲器来负责管理,好让它们以同样的速度来工作,从而提供更快的服务。
40)可否描述云计算中的虚拟机管理程序及其类型?
虚拟机管理程序是虚拟机监测工具,为虚拟机管理资源。虚拟机管理程序主要有两种类型。
类型1:访客虚拟机直接在主机硬件上运行,比如Xen和VMWare ESXI。
类型2:访客虚拟机通过主机操作系统在硬件上运行,比如KVM和Oracle VirtualBox。
欢迎补充~
你遇到过什么有意思的面试问题呢?又是如何作答的?
相关阅读:
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点“百钱买百鸡”问题的C语言算法分析
摘 要:C语言是使用时间最久和最普及的计算机高级程序设计语言之一,属于面向过程的程序设计语言,兼有汇编语言和高级语言的双重特点,是人们学习计算机程序设计的首选语言,也是学习其他计算机课程和进行软件开发的基础。C语言程序设计中的循环语句是C语言的一个难点,可以用来解决许多具有规律性重复操作的实际问题,文章通过对“百钱买百鸡”这个问题的算法进行设计、分析和优化,以寻求解决问题的最优算法。关键词:C语言;循环语句;百钱买百鸡中图分类号:TP311.1 文献标识码:AAbstract:As a process-oriented programming language,C programming language is one of the most classic and popular computer programming languages with the characteristics of the assembly language and the high-level language.It is not only the first choice for the people who begin to learn computer programming,but also the basis for other computer courses and software development.As a difficult point in C Programming Language learning,the loop statement can be used to solve many practical problems of regularly repetitive operation.Taking the case of "spending 100 dollars on 100 chickens",the paper implements design,analysis and optimization,and finally proposes the optimal algorithm.Keywords:C programming language;loop statement;spending 100 dollars on 100 chickens1 引言(Introduction)计算机算法设计是计算机专业学习的核心专业内容,算法设计对于培养一个人的逻辑思维能力具有重要的作用,能进行有效的算法设计是对一个计算机学者的基本要求。求解同一个问题的算法可能有多种,进行算法设计的优劣往往在一定程度上体现出设计者的计算机应用能力,所以,我们要学会如何对一个算法进行分析并进行优化[1,2]。一个算法不一定能说它是最优的,我们所说的最优算法是指在某一种衡量标准下,优于解决该问题的所有可能的算法。一般地,解决某个问题的最优算法是指在时间复杂度的基础上的最优性,时间复杂度是指算法执行的时间长短,通过把算法的核心操作执行的次数作为算法的时间度量[3],这里,我们使用C语言的循环语句解决“百钱买百鸡问题”,基于算法中的循环次数来判断算法的优劣[4,5]。2 C语言循环语句(C language loop statement)C语言是一种广泛使用的程序设计语言,它具有功能丰富、使用灵活、目标程序效率高等特点[6]。C语言是用流程控制语句来控制程序的执行流程,流程控制语句包括顺序结构、选择结构和循环结构三类,C语言中的循环语句又包括for循环语句、while循环语句和do…while循环语句三种,用它们可以解决实际应用中需要重复处理和计算的问题[7,8]。例如,计算1到100之间的整数的和,就需要重复地做加法;求数组中的最大值,需要重复地进行两个数据的比较;求素数问题,需要依次对每个整数进行判断;求百钱买百鸡问题,需要依次穷举每个可能的值通过计算来进行判断;求水仙花问题,需要对范围内的整数依次进行计算判断等等。对于这些复杂的问题,使用循环语句来解决效率很高,下面我们通过“百钱买百鸡”这个经典问题来进行分析。3 “百钱买百鸡”问题描述(The problem descriptionof "spending 100 dollars on 100 chickens")中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?这是一个古典数学问题,买一只公鸡值5钱,一只母鸡值3钱,三只小鸡值1钱,问如果用100钱买100只鸡,那么公鸡、母鸡和小鸡分别多少只?我们假设公鸡、母鸡和小鸡的个数分别为a、b、c,那么买公鸡的钱数为5*a,买母鸡的钱数为3*b,买小鸡的钱数为c/3;并且a、b、c之和为100,a,b,c都是正整数且c是3的倍数,该問题用数学中的三元一次方程组表达如下:4 算法设计与分析(Algorithm design and analysis)对于上述列出的三元一次方程,最直观的方法就是采用三重循环来解决,我们对a、b、c的范围进行限定,用for循环语句进行算法设计,得出算法一如下:该算法直接将三元一次方程转化为C语言三重循环程序,没有进一步考虑a、b、c更小的取值范围,所以导致循环次数为100*100*100=106,算法的复杂度太高,所以我们可以根据每种鸡的价钱先确定a、b、c的取值范围:公鸡为5钱,所以a的取值范围为1—20,当然a的取值的不可能是20,否则100钱刚好买20只公鸡与百鸡的题意不符;b的取值范围为1—33,c的取值范围为3—99;得到算法二如下:
对于这个算法我们可以计算一下它的循环次数为19*33*97=60819次,可见算法的效率还是不高。那么我们还能不能再进行一定的改进呢?通过分析,买小鸡的钱数为c/3,那么小鸡的数量c是3的倍数,所以为了提高执行效率,我们可以把对小鸡的for循环语句中c的步长值设为3,这样可以减少一定的循环次数,也可以去掉c%3==0這个约束条件,得到算法三如下:此时我们再来计算一下以上算法需要执行的循环次数为19*33*33=20691次,很明显,此时算法的执行效率有了一定的提高,缩小小鸡c的取值范围使得算法的循环次数变为上个算法的三分之一。那么这一次改进后的算法就是最理想的算法吗?还有没有进一步改进的空间呢?答案是肯定的。其实只要我们再仔细观察可以发现,这个算法实际上可以不用三重循环,而只用二重循环就可以达到目的,因为二重循环比三重循环会大大降低循环次数,因而提高执行速度。由于公鸡a和母鸡b的数量确定后,其实小鸡c的数量也就等于确定了,即c=100-a-b,从而就不需要再进行加一重循环了,此时又可以去掉a+b+c=100这个约束条件,得到算法四如下:以上算法的循环次数只有19*33=627次,相对上个算法又大幅度提高了算法的执行效率。我们尝试再进行进一步的分析: 我们可以进一步分析出公鸡、母鸡和小鸡的更小范围,根据一只公鸡5钱,一只母鸡3钱,三只小鸡1钱,得知,若a的值为15时,公鸡的总钱为75钱,剩下的25钱最多可买75只小鸡,达不到百鸡数量的要求,所以公鸡a的值必定小于15,a的大致范围是1—14;若b的值为25时,母鸡的总钱为75钱,剩下的25钱最多可买75只小鸡,刚好达到百鸡的数量,所以b的值不会超过25,b的大致取值范围为1—25;由于a、b的最大值分别为14和25,那么要满足百鸡数量的话,c的最小值至少应是61,又当c的值为90只时,小鸡的总钱才30钱,剩下10只即使都买公鸡也只50钱,总钱达不到百钱的要求,所以c的值肯定是小于90,又c是3的倍数,所以大致估算c的取值范围为63—87。既然a、b、c的大致范围都确定了,我们可以得到下列算法五:根据对算法五的三种情况进行对比可以发现,情况一的执行次数为126,情况二的执行次数为25*9=225,情况三的执行次数为14*25=350,显然选择取值范围小的两个变量作为循环变量来构造二重循环是比较合理的,当然这三种情况的算法执行效率都要优于前面的算法。5 结论(Conclusion)以上五个算法是应用多重循环语句对“百钱买百鸡”问题的算法分析,由差到优循序渐进地对算法进行了改进,通过每一次的改进降低了算法的执行时间,从最初的106次的循环执行次数降到了最后的126次,最终得到了最为理想的算法。所以,我们在进行算法设计时,不应该只是得出了正确的算法就可以了,而是要尽量去寻找最优的算法,要具有不断地对已有算法设计进行改进和优化的精神。当然,该问题的解决方法不止于此,必定还会有一些更优的算法值得我们去探索。参考文献(References)[1] Fathima H.,Musthafa A.Syed.Optimization Based Routing Algorithms[J].International Journal of Applied Research on Information Technology and Computing,):55-70.[2] Guang-Yu Zhu,Wei-BoZhang.Optimal Foraging Algorithm for Global Optimization[J].Applied Soft Computing,4-313.[3] R.VenkataRao,G.G.Waghmare.A New Optimization Algorithm for Solving Complex Constrained Design Optimization Problems[J].Engineering Optimization,):60-83.[4] 黄隆华,陈志辉.算法设计与分析课程的“百钱买百鸡问题”趣用[J].计算机教育,2016(3):143-145.[5] 耿国华.算法设计与分析[M].北京:高等教育出版社,2012(1): 20-22.[6] 许桂平.浅析C语言三种循环结构语句[J].考试周刊,2014 (21):117-118.[7] 任爱华.C语言程序设计[M].北京:中央广播电视大学出版社,.[8] 马学敏.计算机C语言循环语句的应用研究[J].中国新通信, 2016(17):87-88.作者简介:龙敏敏(1979-),女,本科,讲师.研究领域:计算机应用技术,计算机教育教学.
软件工程的其它文章《妙趣横生的算法(C语言实现 第2版)》(杨峰)【摘要 书评 试读】- 京东图书
妙趣横生的算法(C语言实现 第2版)
京 东 价 &
[定价 &¥]
PLUS会员专享价
您购买此商品可享受专属价
增值业务 &
重  量 &
选择系列 &
搭配赠品 &
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
商品介绍加载中...
扫一扫,精彩好书免费看
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
印刷版次不同,印刷时间和版次以实物为准。
价格说明:
京东价:京东价为商品的销售价,是您最终决定是否购买商品的依据。
划线价:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。
异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。
iframe(src='//www.googletagmanager.com/ns.html?id=GTM-T947SH', height='0', width='0', style='display: visibility:')算法 c语言实现排列组合算法问题 - 为程序员服务
为程序员服务
c语言实现排列组合算法问题
排列组合是算法常用的基本工具,如何在c语言中实现排列组合呢?思路如下:
首先看递归实现,由于递归将问题逐级分解,因此相对比较容易理解,但是需要消耗大量的栈空间,如果线程栈空间不够,那么就运行不下去了,而且函数调用开销也比较大。
(1) 全排列:
全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。
例如:{1, 2, 3}的全排列为:
123;132;
213;231;
312;321;
共6个,即3!=321=6。
这个是怎么算出来的呢?
首先取一个元素,例如取出了1,那么就还剩下{2, 3}。
然后再从剩下的集合中取出一个元素,例如取出2,那么还剩下{3}。
以此类推,把所有可能的情况取一遍,就是全排列了,如图:
知道了这个过程,算法也就写出来了:
将数组看为一个集合,将集合分为两部分:0~s和s~e,其中0~s表示已经选出来的元素,而s~e表示还没有选择的元素。
perm(set, s, e)
顺序从s~e中选出一个元素与s交换(即选出一个元素)
调用perm(set, s + 1, e)
直到s&e,即剩余集合已经为空了,输出set
c语言代码如下:
void perm(int list[], int s, int e, void (*cbk)(int list[]))
(*cbk)(list);
for(i = i &= i++)
swap(list, s, i);
perm(list, s + 1, e, cbk);
swap(list, s, i);
void swap(int * o, int i, int j)
int tmp = o[i];
o[i] = o[j];
void cbk_print(int * subs)
printf(&{&);
for(int i = 0; i & LEN; i++)
printf(&%d&, subs[i]);
(i == LEN - 1) ? printf(&&) : printf(&, &);
printf(&}\n&);
(2)组合:
组合指从n个不同元素中取出m个元素来合成的一个组,这个组内元素没有顺序。使用C(n, k)表示从n个元素中取出k个元素的取法数。
C(n, k) = n! / (k! * (n-k)!)
例如:从{1,2,3,4}中取出2个元素的组合为:
12;13;14;
方法是:先从集合中取出一个元素,例如取出1,则剩下{2,3,4}
然后从剩下的集合中取出一个元素,例如取出2
这时12就构成了一个组,如图。
从上面这个过程可以看出,每一次从集合中选出一个元素,然后对剩余的集合(n-1)进行一次k-1组合。
comb(set, subset, n, k)
反向从集合中选出一个元素,将这个元素放入subset中。
调用comb(set, subset, n-1, k-1)
直到只需要选一个元素为止
C语言代码如下:
void combine(int s[], int n, int k, void (*cbk)(int * subset, int k))
if(k == 0)
cbk(subset, k);
for(int i = i &= i--)
subset[k-1] = s[i-1];
combine(s, i-1, k-1, cbk);
cbk(subset, subset_length);
任何递归算法都可以转换为非递归算法,只要使用一个栈模拟函数调用过程中对参数的保存就行了,当然,这样的方法没有多少意思,在这里就不讲了。下面要说的是用其它思路实现的非递归算法:
(1)全排列:
首先来看一段代码:
#include &iostream&
#include &algorithm&
int main () {
int myints[] = {1,2,3};
cout && &The 3! possible permutations with 3 elements:\n&;
sort (myints,myints+3);
cout && myints[0] && & & && myints[1] && & & && myints[2] &&
} while ( next_permutation (myints,myints+3) );
这段代码是从STL Permutation上考下来的,要注意的是第10行,首先对数组进行了排序。
第14行的next_permutation()是STL的函数,它的原理是这样的:生成当前列表的下一个相邻的字典序列表,里面的元素只能交换位置,数值不能改变。
什么意思呢?
123的下一个字典序是132,因为132比123大,但是又比其他的序列小。
(1) 从右向左,找出第一个比右边数字小的数字A。
(2) 从右向左,找出第一个比A大的数字B。
(3) 交换A和B。
(4) 将A后面的串(不包括A)反转。
就完成了。
好,现在按照上面的思路,写出next_permutation函数:
template &class T&
bool next_perm(T * start, T * end)
//_asm{int 3}
if (start == end)
T * pA = NULL, * pB;
// find A.
for (T * p = p &= p--)
if (*p & tmp)
if (pA == NULL)
// find B.
for (T * p = p &= p--)
if (*p & *pA)
// swap A, B.
tmp = *pA;
*pA = *pB;
// flip sequence after A
for (T *p = pA+1, *q = p & p++, q--)
(2)组合:01交换法
使用0或1表示集合中的元素是否出现在选出的集合中,因此一个0/1列表即可表示选出哪些元素。
例如:[1 2 3 4 5],选出的元素是[1 2 3]那么列表就是[1 1 1 0 0]。
算法是这样的:
comb(set, n, k)
(1) 从左到右扫描0/1列表,如果遇到“10”组合,就将它转换为”01”.
(2) 将上一步找出的“10”组合前面的所有1全部移到set的最左侧。
(3) 重复(1) (2)直到没有“10”组合出现。
代码如下:
template&class T&
void combine(T set[], int n, int k, void (*cbk)(T set[]))
unsigned char * vec = new unsigned char[n];
T * subset = new T[k];
// build the 0-1 vector.
for(int i = 0; i & i++)
if (i & k)
vec[i] = 1;
vec[i] = 0;
// begin scan.
bool has_next =
while (has_next)
// get choosen.
int j = 0;
for (int i = 0; i & i++)
if (vec[i] == 1)
subset[j++] = set[i];
cbk(subset);
has_next =
for (int i = 0; i & n - 1; i++)
if (vec[i] == 1 && vec[i + 1] == 0)
vec[i] = 0;
vec[i + 1] = 1;
// move all 1 to left-most side.
int count = 0;
for (int j = 0; j & j++)
if (vec[j] == 1)
if (count & i)
for (int j = 0; j & j++)
vec[j] = 1;
for (int j = j & j++)
vec[j] = 0;
has_next =
至于其中的道理,n个位置上有k个1,按照算法移动,可以保证k个1的位置不重复,且覆盖n一遍。
您可能的代码
相关聚客文章
写的好,支持下
你好,能否帮我写个类似的代码,我的QQ:。价格QQ里谈
相关专栏文章

我要回帖

更多关于 简便算法计算题 的文章

 

随机推荐