判断二进制数中有多少个1

文章通过一个抽奖问题引入,探讨如何利用二进制数的奇偶性来计算满足特定条件(如至少抽中6次指定卡牌)的概率。通过建立模型并编写程序,分别计算了在固定抽取次数和提前达到条件停止抽取时的中奖概率,揭示了概率变化背后的原因。
摘要由CSDN通过智能技术生成

一、提出问题

        有一种抽奖活动,需要玩家抽中6次指定卡牌即可获奖,假设每次抽取都是独立的,抽中指定卡牌概率均为50%,卡池无限大。如果一名玩家总共抽取10次卡牌,问:能够获奖的概率?

二、建立模型

        首先建立一个可以表示抽奖结果的模型。因为每次抽取只有两种结果,且概率为50%,故可以用1和0来分别表示中和未中指定卡牌;玩家抽奖结果则可以表示为一串二进制数,如:1011001001,代表其中5次抽中指定卡牌,5次未抽中。

        然后设计一个可以统计二进制数中1的个数的方法。考虑到十进制数为偶数时,对应的二进制数尾数为0;十进制数为奇数时,对应的二进制数尾数为1;通过二进制数所对应十进制数的奇偶性,可以判断二进制数的尾数是否为1。以此为基础,只要判断完一次二进制数的尾数,如果是偶数则除以2,如果是奇数则减1再除以2,就可以去掉已判断的尾数,并进行下一次新的对尾数的判断,以此类推,直到这个数变为0。

        方法程序代码如下:

int count(int x){
	int num=0;
	
	while(x!=0){
		if(x%2==1){
			x=(x-1)/2;
			num++;
		}else
			x=x/2;
	}
	
	return num;
}

        例如统计前例1011001001中1的个数,程序运行如下:

int main(void){
	printf(
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值