《编程珠玑》第四章 习题6 一个模拟程序

这是一道“咖啡罐问题”,一个盛装一些黑豆和白豆的咖啡罐,然后重复一下过程,直到罐中只剩下一粒豆子为止:
随机从罐中选择两粒豆子。如果他们的颜色相同,就将它们都扔掉,并且在罐中放入一粒额外的黑豆。如果他们的颜色既有白色也有黑色,则将白豆返回罐中,同时扔掉黑豆。我们可以很容易的证明最后罐中会剩下一粒豆子,因为每次我们都会从罐中取走一粒种子。仔细观察,我们发现,每次操作相当于两种操作:1、取出两粒白豆 2、取出一粒白豆。由此可见,当白豆原有奇数时,最后剩下的就是白豆。偶数的话,剩下的就是黑豆。
写了一个模拟程序,给定豆子数以及白色豆子的个数,随机取豆操作,直至剩下最后一粒豆子:
void WhiteBlack(int coffee[])
{
//operation
int col1,col2;
while (!OnlyOne(coffee))
{
col1 = TakingOne(coffee);
col2 = TakingOne(coffee);
cout<<col1<<'\t'<<col2<<endl;
if (col1 == col2) PutingInOne(coffee,2); //the same color,put into a black one
else PutingInOne(coffee,1); //remain the white one
}
cout<<"ok"<<endl;
}

TakingOne()和 PutingInOne()是随机选取豆子和放入豆子。OnlyOne()则是判断当前咖啡罐是否只剩下一个豆子。

本章就到此结束,主要是对程序进行验证,写断言好像哈不太习惯,不过assert对程序的理解和维护都很重要的,自己都是些注释比较习惯。此外,花了大概一个小时写了一个二分查找程序,还好,程序没错,就是不够优美,把最后一次比较提取出判断了,导致程序代码重复,多写了5~6行冗余代码。对边界的把握还有待提高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值