剑指Offer-五只猴子吃桃子

题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子? 


题目分析

从开始的第一只猴子开始想,他将桃子分成五份然后多出来一份,剩下的也就是这一堆桃子总数A的(A-1)/5 * 4个桃子,也就是原来桃子数除去1个以后的五分之四个。接下来第二只猴子来了以后,把这剩下的桃子又分为五份仍然剩下一份,那么,这个平均分的数目可以表示为((A-1)/5*4 - 1) /5 ,然后最后剩下的交给下面的猴子分割的数目为((A-1)/5*4 - 1) /5 * 4,然后不断的迭代这个公式得到((((A-1)/5*4 - 1) /5 * 4 -1)/5 * 4 - 1) /5 * 4 - 1)/5  ==y,这个y表示的是最后一个猴子分到的桃子的数量。


解题思路

以最后一只猴子的桃子个数为出发点,倒着推第一个猴子的个数,那么给定一个最后这个猴子的桃子数量以后不断计算它前一个猴子的桃子数量,计算前一个猴子的时候,要保证的是这个猴子的桃子数应该可以把4除尽,因为公式中存在四分之五要想保证每一步都能按照题目的意思分好,那么就需要在每一次倒推的时候,计算出来的值要保证能够全部除尽4这个值。

(((((5*y + 1) / 4 * 5 + 1) / 4 * 5 + 1) / 4 * 5 + 1) / 4 * 5 + 1) = A

根据这个思路的话,试想如果正推的话应该也是可以的了。


代码实现

public static void main(String[] args) {
		
		int minCount = 4;
		int minCountCopy = minCount;
		
		for(int i = 0; i < 5; i++) {
			
			if(i == 0) {
				minCount = minCountCopy;
				minCount = minCount * 5 + 1;
			} else {
				
				if(minCount % 4 != 0) {
					minCount = minCountCopy;
					minCount ++;
					minCountCopy = minCount;
					i = -1;
				}
				minCount = minCount * 5 / 4 + 1;
			}
		}
		
		System.out.println(minCount);
	}


你可能感兴趣的:(剑指Offer-五只猴子吃桃子)