核心思想就是 num = (num-1)*(4/5),num要连续5次满足这个式子还是是整数,就是最小数量
#include<stdio.h>
/**
* 猴子分桃子 , 树林里有一堆桃子 ,
* 第一个猴子过来之后 扔到一个桃子 , 然后把桃子平均分成5份 , 自己拿走一份
第二个猴子过来 扔到一个桃子 , 把桃子平均分成5份 , 自己拿走一个份
第三个 第四个 第五个猴子都这么做 ...
请问 树林里的桃子最少要有多少个 ?
3121
3121-1 / 5 * 4 = 2496
2496 -1 /5 *4 = 1996
1996 -1 / 5 *4 = 1596
1596 -1 / 5*4 = 1276
1276 - 1/ 5*4 = 1020
*/
#include<stdio.h>
int main(){
for (int i = 6;; i++) {
int sum = i;
for (int j = 0; j < 5; j++) {
if( sum % 5 != 1){ //不满足总数除以5余1的条件不是桃子的数量
break;
}
printf("sum=%d\n",sum);
sum = (sum-1) / 5 * 4; //总数减去1,剩余4/5
if( j == 4){
printf("桃子数为: %d ",i);
return 0;
}
}
}
}
#include<stdio.h>
int IsNumber(int num) {
int i = 0;
while(i<5){
//只有正确的桃子数i才会累加到5,返回true
//反之不正常时,要么直接执行else,要么先执行1到3次if再执行else返回false
if((num-1)%5==0){
//(num-1)/5是每个猴子拿走的桃子,-1是每个猴子扔到海里的
// num = num-(num-1)/5-1; //减去-1后,分成五份,再减去被扔进海里的1个 (num-1) - (num-1)/5 = (num-1)*(1-1/5)=(num-1)*4/5
num = (num-1)*4/5; //num-1 后分成5份,一份被拿走了;剩余四份
i++;
}else
return 0;
}
return 1;
}
int main(){
//假设每个猴子拿走1个,加上每个猴子仍在海里的1个,
//剩下的4个,所以从14开始,其实好多开始不重要
int num = 14;
while(true){
//执行方法IsNumber()查看桃子数是否符合要求
if(IsNumber(num)){
break;
}
num++;//桃子数不合适加1
}
printf("%d ",num);
}
参考:
https://blog.csdn.net/qq_37865067/article/details/86629875?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3