厦大1394 抛硬币

 

其实,小明有一个小秘密,那就是暗恋计算机系的一个女生很久了。但是又不知道那个女生是怎么想的。3.7女生节就要到了,小明一直在纠结要不要跟那个女生表白。思来想去没有结果。于是乎他觉得采用最原始的办法——抛硬币来决定。正面表白,反面继续沉默观望。不过就像《爱情公寓3》结尾曾小贤说的那样“当面对两个选择时,抛硬币总能奏效,并不是因为它总能给出对的答案,而是在你把它抛在空中的那一秒里,你突然知道你希望它是什么!”呃呃呃,扯远了,其实当硬币还停留在空中的时候,小明想知道的却是:如果我连续抛N次,那么不连续出现正面的可能情况有多少种(即任何相邻两次都不全是正面)?哎,也许这就是作为工科生的思维吧!

请你帮小明写一个程序,输出所有的可能情况(用0表示反面,1表示正面)。

提示:任何一个合法序列的特征是不存在2个1相邻,例如N=4,可行的有0000,0001,0010,0100,0101,1000,1001,1010,共8种。

输入

输入只有一行一个整数N,表示抛N次硬币。(1≤N≤14 1 \le N \le 141≤N≤14)

输出

输出有M+1行。

前M行输出每一种可能情况,不同情况按照字典序从小到大排列。

最后一行输出一个数字M,表示不连续出现正面的可能情况的总数。

输入样例 1

4

输出样例 1

0000
0001
0010
0100
0101
1000
1001
1010
8
#include<stdio.h>
#include<string.h>

int b[15], n;

int trans(int i)
{
	int cnt = 1, flag = 1;
	int x = i;
	b[0] = x%2;  
	x/=2;
	while(x>0)
	{
		int t = x%2;
		b[cnt] = t;
		x/=2;
		if(b[cnt] && b[cnt]==b[cnt-1]){
			flag = 0; break;
		}
		cnt++;
				
	}
	
	for(int i = cnt; i < n; i++) b[i] = 0;
	
	if(flag){
		for(int i=n-1; i>=0; i--) printf("%d",b[i]);
		printf("\n");
	}
	return flag;
}

int main()
{
	int ok, cnt=0;
	scanf("%d",&n);
	for(int i=0; i< (1 << n); i++)
	{
		ok = trans(i);
		if(ok) cnt++;
	}
	printf("%d\n", cnt);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值