C语言:猴子分桃

#include <stdio.h>
//题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,
//它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
//1.程序分析:
//2.程序源代码:
//设第五只猴子拿走n个
//第五只猴子分之前有:5n+1(个)
//第四只猴子分之前有:(5n+1)×5/4+1
//=25/4n+9/4(个)
//第三只猴子分之前有:(25/4n+9/4)×5/4+1
//=125/16n+61/16(个)
//第二只猴子分之前有:(125/16n+61/16)×5/4+1
//=625/64n+369/64(个)
//第一只猴子分之前有【原来】:(625/64n+369/64)×5/4+1
//=3125/256n+2101/256(个)
//3125/256=12又53/256
//2101/256=8又53/256
//53n+53是256的倍数,n最小为255
//n=255时,3125/256n+2101/256=3121(个)
//答:海滩上原来最少有3121个桃子
//假设第五只猴子拿到了a个桃子,那么在第五只猴子拿之前,共有5a+1个桃子。
//假设第四只猴子拿到了b个桃子,那么在第四只猴子拿到桃子后,还剩4b个桃子。
//则,4 b = 5 a + 1 , b = ( 5 a + 1 ) / 4 4b = 5a + 1, b = (5a + 1) / 44b=5a+1,b=(5a+1)/4。
//即前一天猴子拿到的桃子数可以通过后面一天猴子的桃子数推出来,由此可得解题思路:
//
//第五天海滩上的桃子总数m一定可以整除4(否则第四天的桃子数量不是整数),从第五天开始,前一天的桃子总数都是后一天桃子总数的5倍加1。
//海滩上有一堆桃子,5个猴子来分

int main() {
    int m, i, j, count; //j代表第五天的桃子数,m暂存j的值,当前j不符合条件时再从m开始遍历
    for (j = 4; j < 10000; j += 4) {
        m = j;
        for (i = 0; i < 5; i++) { //循环求前四天的桃子数
            count = (j / 4) * 5 + 1;
            if (count % 4 != 0) break; //如果中间结果不能整除4,直接跳出循环
            j = count;
        }
        if (i == 4) { //此时count为第一天的桃子数
            printf("total peaches = %d\n", count);
        } else {
            j = m;
        }
    }
    return 0;
}

 

posted @ 2023-02-28 05:46  myrj  阅读(158)  评论(0编辑  收藏  举报