8个人买包子问题

问题描述:8个人去买包子,每人买一个,其中四个人手上有5元,4个人手上有10元。一个包子5元,而老板手里没有零钱,问:如何排队才不会使老板找不开零钱?


考虑到 只有两个数值,可以用1代表手里有10元的人,0代表手里有5元的人。这样买包子的顺序就组成了一个二进制数;

设为a,则由题意可得,0x0f<=a<=0xf0;

使用for循环去验证每个a是否符合约束条件,符合即输出;

#include<stdio.h>
//0代表5.1代表10
int number1(int a);//计算一个数二进制数1的个数。
void print(int a);//将正数按位输出。8位
int total(int a);//计算总数
void main()
{
	int a, i, b, j;
	for (a = 0x0f; a <= 0xf0; a++)
	{
		b = total(a);
		if(number1(a) == 4)
		{
			if (b >= 0)
			{
				print(a);
				printf("\n");
			}
		}
	}

}
//计算一个数二进制数1的个数。
int number1(int a)
{
	int i, number = 0;
	for (i = 0; i<8; i++)
	{
		a = a >> i;
		if (a & 0x01 == 0x01)
			number++;
		a = a << i;
	}
	return number;
}
//将正数按位输出。8位
void print(int a)
{
	int i;
	for (i = 0; i<8; i++)
	{
		a = a >> i;
		if (a & 0x01 == 0x01)//这以为是1
		{
			printf("%d ", 10);
		}
		else
		{
			printf("%d ", 5);
		}
		a = a << i;
	}

}
int total(int a)
{
	int total1 = 0;
	int i;
	for (i = 0; i < 8; i++)
	{
		if (total1 >= 0)
		{
			a = a >> i;
			if (a & 0x01 == 0x01)//该位是1
			{
				total1 -= 5;
			}
			else{ total1 += 5; }
			a = a << i;
		}
		else
			return -1;
	}
	return total1;
}

在编程过程中遇到很多问题:

例如,在使用total函数和number1函数以及print函数时,这几个函数在单纯的实现功能上没有任何问题,但是在这个过程中,会改变a的值。

所以在没有total函数的前提下,将total函数内容加入到main函数然后再使用print函数打印的过程中,会出现错误,因为这个输出的a在

a=a>>i;

a=a<<j;

过程中a的值改变了,所以会导致出错。

目前暂时还没学习高级算法,可能学了以后就有有更简单的方法。

同时也体会到编程中程序模块化的方便之处。方便修改,

一下是运行结果,也不晓得全不全,如果有错误,敬请指正。

5 10 5 10 5 10 5 10
5 5 10 10 5 10 5 10
5 10 5 5 10 10 5 10
5 5 10 5 10 10 5 10
5 5 5 10 10 10 5 10
5 10 5 10 5 5 10 10
5 5 10 10 5 5 10 10
5 10 5 5 10 5 10 10
5 5 10 5 10 5 10 10
5 5 5 10 10 5 10 10
5 10 5 5 5 10 10 10
5 5 10 5 5 10 10 10
5 5 5 10 5 10 10 10
5 5 5 5 10 10 10 10
请按任意键继续. . .


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值