posts - 200, comments - 8, trackbacks - 0, articles - 0

进制数模式

Posted on 2013-06-06 21:57 鑫龙 阅读(194) 评论(0)  编辑 收藏 引用 所属分类: 数据结构与算法
考虑n位二进制数,有多少个数中不存在两个相邻的1。例如,3位数中有5个数符合这一要求:000、001、010、100、101。 
1、试找出其中的规律 
2、请给出完整代码实现(参数输入代码可略) 
3、试证明你找到的规律是正确的 
1、 答:规律为2 n/2+2n-n/2-1。 
2、 代码如下 
#include<cmath> 
using namespace std; 
int Func(int n) { 
  if(n<0) {  return -1; } 
  if(n==0) {  return 0; } 
  return pow(2,(n/2))+pow(2,((n-(n/2)))-1;
 
3、 证明(构造法) 
答: 
1列出n位由1组成的2进制数a,111。。。。111;
2奇数位都用0取代得到数b,010。。。。010; 
3偶数位也用0取代得到数c,101。。。。101; 
4数b和数c中的任何一个1都可以被0取代,或不被取代,而构造出满足要求的数,且每个1的取代具有独立性。 
5数b可以构造出2n/2个满足要求的数,同时数c可以构造出2n-n/2个满足要求的数。 
6数b和数a都可以构造出全由0组成二进制数,因此统计存在一个重复。 
7规律为2 n/2+2n-n/2-1;

-------------------------------------------------------------------------------------------------
n位的二进制,比如3位:000 001 010 100 101
什么规律呢,假设n位二进制有f(n)种不相邻的组合,
从最左边的位置开始放,可以放0,也可以放1。
如果最左边放0,那么将不影响第二位的放置,从第二位放起,即有f(n-1)种。
如果最左边放1,那么第二位则只能放0,从第三位放起,即有f(n-2)种。
所以f(n)=f(n-1)+f(n-2)种。
另外f(1)=2(因为可以放0或者1),f(2)=3(因为可以是00,01,10)。





只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理