8个人买包子问题

来源:互联网 发布:php socket 客服系统 编辑:程序博客网 时间:2024/04/27 23:22

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


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

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

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

#include<stdio.h>//0代表5.1代表10int 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;}elsereturn -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 105 5 10 10 5 10 5 105 10 5 5 10 10 5 105 5 10 5 10 10 5 105 5 5 10 10 10 5 105 10 5 10 5 5 10 105 5 10 10 5 5 10 105 10 5 5 10 5 10 105 5 10 5 10 5 10 105 5 5 10 10 5 10 105 10 5 5 5 10 10 105 5 10 5 5 10 10 105 5 5 10 5 10 10 105 5 5 5 10 10 10 10请按任意键继续. . .


0 0
原创粉丝点击