今天看面试宝典,想起来小学的分骆驼问题,我们来回顾下:
有位老人死后留下了十七只骆驼及一张遗嘱给他的三个儿子。依照遗嘱的划分,老大可以得到一半数量的骆驼,老二则是三分之一,老三则是九分之一。三兄弟为了这问题大伤脑筋,最后没有办法,只好请族长裁断。族长了解情况后,笑眯眯地表示,为了要让兄弟们和睦相处,决定再送他们一只骆驼,以凑成十八只。这样子,老大就得了九只骆驼,老二、老三则分别拿到六只和两只。有趣的是,三兄弟的骆驼加起来还是十七只,多的那一只,仍旧完璧归赵地回到族长手中。
小时候感觉好神奇啊,借个骆驼就能解决问题!真是吊!但是本身1/2+1/3+1/9就不等于1。意思就是他们老爸分的时候就没当单位1来分。
而且巧的是用17乘以每个分数的结果换算成小数再四舍五入正好是9,6,2.所以才能分,所以这还不算什么难题。
试问:他们老爸要是再坑点,给大儿子留5/9或者给老三留1/6,你看怎么分吧!!借多少头也搞不定啊。
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; const int Camel_Num = 17; void DivCamel(double big, double mid, double litter) { int res[3] = { 0, 0, 0 }; while (true && res[0] < Camel_Num && res[1] < Camel_Num && res[2] < Camel_Num) { if ((double)res[0] / Camel_Num >= big) { while (true && res[0] < Camel_Num && res[1] < Camel_Num && res[2] < Camel_Num) { if ((double)res[1] / Camel_Num >= mid) { res[2] = (Camel_Num - res[0] - res[1])>=0?Camel_Num - res[0] - res[1]:0; if ((double)res[2] / Camel_Num >= litter) { cout << res[0] << "," << res[1] << "," << res[2] << endl; } } res[1]++; } } res[0]++; } } int main() { DivCamel(1.00 / 2.00, 1.00 / 3.00, 1.00 / 9.00); return 0; }
这个换成1.00/6.00,就木有输出了。(程序写的糟糕,媳妇催着去陪她了)。