c语言经典算法——猴子偷桃问题

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

算法分析://初始桃子数为sum
第一次:sum=5*x1+1   
第二次:4*x1=5*x2+1
第三次:4*x2=5*x3+1
第四次:4*x3=5*x4+1
第五次:4*x4=5*x5+1
第五次分配结束:剩下4*x5个桃子,而x5>=1,故i=4*x5>=4 。每次向上推j=(i/4)*5+1;i=j;每次上推结束后判断j%4是否等于0,如果为0则继续上推,否则更新i,直到找到能够完成五次上推的整数i,最后可以得到最初的桃子数。

C语言程序:

#include<stdio.h>
int main(int agrc, char*agrv[])
{
    int i, m, j, k, count;
    for (i = 4; i<10000; i += 4)
/*i为5个猴子分配桃子后最后剩余的桃子,必须为4的倍数,然后以此为基础,
向上推5次,如果刚好能够推到第五次,则此剩余的桃子数i是满足条件的,否则换一个
剩余的桃子数,直到找到符合条件的最小剩余桃子数*/
    {
        count = 0;
        m = i;
        for (k = 0; k<5; k++)
        {
            j = i / 4 * 5 + 1;
            i = j;
            if (j % 4 == 0)
                count++;
            else
                break;
        }
        i = m;
        if (count == 4)
        {
            printf("原来最少的桃子数为:%d\n", j);
            break;
        }
    }
    system("pause");
    return 0;
}
时间: 2024-10-24 16:50:20

c语言经典算法——猴子偷桃问题的相关文章

C语言经典算法五个人问岁数!——————【Badboy】

有5 个人坐在一起,问第五个人多少岁?他说比第4 个人大2 岁.问第4 个人岁数,他说比第3 个人大2 岁.问第三个人,又说比第2 人大两岁.问第2 个人,说比第一个人大两岁.最后问第一个人,他说是10 岁.请问第五个人多大? 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段.要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10 岁),再往回推. 2.程序源代码: #include #include int main() { int i=5; int age(int);

算法——猴子分桃

想做些有关“算法”的练习题,在网上无意间看到了一道很经典的算法题——猴子分桃,于是百度了一下,才发现这道题的相关文档很多很多,但最多的也就是使用C++或者Java来解决这道题,而自己也是初次接触C++. 1.先介绍一下C++使用最常见的编辑器——dev cpp.附上下载地址:(http://bloodshed-dev-c.en.softonic.com/download); 2.: 3.接着选好所要下载好的地址: 4.剩下的事情就是“一路默认”,直至安装完成. 然后就剩启动Dev C++,启动完

[php] 猴子偷桃

/* 10:五只猴子采得一堆桃子,猴子彼此约定隔天早起后再分食. 不过,就在半夜里,一只猴子偷偷起来,把桃子均分成五堆后, 发现还多一个,它吃掉这桃子,并拿走了其中一堆.第二只猴子醒来, 又把桃子均分成五堆后,还是多了一个,它也吃掉这个桃子,并拿走了其中一堆. 第三只,第四只,第五只猴子都依次如此分食桃子.那么桃子数最少应该有几个呢? 设总数为x 第0个猴子偷掉后剩下的总数 (x-1)4/5=H1 第1个猴子偷掉后剩下的总数 (H1-1)4/5=H2 第2个猴子偷掉后剩下的总数 (H2-1)4/

经典的猴子吃桃问题,C语言算法,根据天数和当日桃子个数,求第一天猴子所摘桃的个数,

#include<stdio.h> #include<stdlib.h> int tao_m(int a,int m) { int day[10]; int i; day[a-1] = m; for (i = a-2; i >= 0; i--) { day[i] = 2 * (day[i + 1] + 1); } return (day[0]); }   int main() { int d, m; printf("请输入今天是是猴子摘桃后的第几天:");

c语言经典算法—求0—7 所能组成的奇数个数

题目:求0—7 所能组成的奇数个数. 算法思想:这个问题其实是一个排列组合的问题,设这个数为sun=a1a2a3a4a5a6a7a8,a1-a8表示这个数的某位的数值,当一个数的最后一位为奇数时,那么这个数一定为奇数,不管前面几位是什么数字.如果最后一位数为偶数,则这个数一定为偶数.a1-a8可以取0-7这个八个数字,首位数字不为0.从该数为一位数到该数为8位数开始统计奇数的个数:1.当只有一位数时也就是该数的最后一位,奇数个数为42.当该数为两位数时,奇数个数为4*7=283.当该数为三位数时

c语言经典算法——查找一个整数数组中第二大数

题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1赋给max2,使原先最大的数成为第二大的数,再将这个数a赋给max1,如果这个数a比max1小但比max2大,则将这个数a赋值给max2,依次类推,直到数组中的数都比较完. c语言代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #defin

经典算法题每日演练——第三题 猴子吃桃

原文:经典算法题每日演练--第三题 猴子吃桃 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多少个桃子? 分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了. 令S10=1,容易看出 S9=2(S10+1), 简化一下 S9=2S10+2 S8=2S

C语言100个经典算法

POJ上做做ACM的题 语言的学习基础,100个经典的算法C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数 为多少? __________________________________________________________________ 程序分析:兔子的规律为数列1,1,2,3,5,8

C语言100道经典算法

经典的100个c算法 C语言的学习要从基础,100个经典的算法真不知道关于语言的应该发在那里,所以就在这里发了,发贴的原因有2个,第一个,这东西非常值得学习,第二个,想..........嘿嘿,大家应该能猜到吧语言的学习基础,100个经典的算法C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的 算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?