问题描述: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
请按任意键继续. . .