/*
5.A/B/C/D/E 5个人在某天夜里合伙去捕鱼,到凌晨时都疲惫不堪,于是各自找地方睡觉,第二天,A第一个醒来,他将鱼分成5份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分成5份,把多余的一条鱼扔掉,拿走自己的一份。C/D/E依次醒来,按同样的方法拿鱼。问他们合伙至少捕了多少条鱼?
假设
fun(1)
fun(2) = ((fun(1) - 1) / 5) * 4 // 隐含 (fun(1) - 1) % 5 == 0
fun(3) = ((fun(2) - 1) / 5) * 4 // 隐含 (fun(2) - 1) % 5 == 0
fun(4) = ((fun(3) - 1) / 5) * 4 // 隐含 (fun(3) - 1) % 5 == 0
fun(5) = ((fun(4) - 1) / 5) * 4 // 隐含 (fun(4) - 1) % 5 == 0
fun(6) = ((fun(5) - 1) / 5) * 4 // 隐含 (fun(5) - 1) % 5 == 0
*/
/*
自己尝试完善了分鱼的方法,(其实是两个人分的时候结果对不上= =),
totalFish 要定义成person+1比较准确,然后后面能否分鱼判断的时候要加上一个条件:
剩下的鱼扔掉一条后要足够分人份,即:leftFish - 1 >= person
*/
1 #include <stdio.h> 2 int shareFish(int person){ 3 //假设捕鱼6条(即是第一次分鱼至少要几条鱼) 4 int totalFish = person+1; 5 //计数器,往上叠加鱼的数目直至条件成立 6 for (int i = totalFish; 1; i++) { 7 //记录剩下的鱼数 8 int leftFish = i; 9 //假设找到了这个数字 10 int isFind = 1; 11 //分五次鱼 12 for (int j = 0; j < person; j++) { 13 //尝试能否分出鱼,鱼至少要够人份 14 if ((leftFish - 1 ) % person == 0 && leftFish - 1 >= person) { 15 //计算分鱼之后的鱼数目 16 leftFish = (( leftFish - 1 ) / person ) * ( person - 1 ); 17 }else{ 18 //如果不能分就跳出循环(表示没找到) 19 isFind = 0; 20 break; 21 } 22 } 23 //如果可以分就跳出循环 24 if (isFind) { 25 totalFish = i; 26 // printf("%d",i); 27 break; 28 } 29 } 30 return totalFish; 31 } 32 33 int main(){ 34 //五个人分鱼,呵呵,把'5'改掉想几个人就几个人分! 35 int total = shareFish(5); 36 printf("%d",total); 37 return 0; 38 }