C语言每日一练——第48天:五猴分桃问题

C语言每日一练——第48天:五猴分桃问题,第1张

C语言每日一练——第48天:五猴分桃问题

C语言每日一练
2021年10月30日

文章目录
  • 题目描述
  • 分析
  • 代码实现
  • 运行结果
  • 网上参考

题目描述

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

分析

每只猴子都能分成5份后多出一个,有五只猴子,所以可以理解为有一个数x,它能完成5次以下运算:(x-1)/5,且每次都能除尽,每分一次,还需要乘4/5,因为每只猴子分完还得拿走一份。题目要求求出最小的满足以上条件的数字。【倒推法更快,见下文】

代码实现
#include 

#define NUMBER_RANGE  10000  //桃子个数最大范围
int main()
{
    int i = 0;
    int j = 0;
    int tmp = 0;
    for(i = 1; i <= NUMBER_RANGE; i++)
    {
        tmp = i;
        for(j = 0; j < 5; j++)
        {   
            if((tmp - 1) % 5 != 0 || tmp <= 1) //扔掉一个是否能分成5份
                break;                         //不符合要求
            tmp = (tmp - 1) / 5 * 4;           //分完第j+1次后剩下的桃子
        }
        if(j == 5)                             //符合条件
        {
            printf("原来的桃子个数最少为%dn", i);
            return 0;
        }
    }
    printf("桃子数大于%dn", NUMBER_RANGE);
    return 0;
}

运行结果

网上参考

原文链接:https://www.runoob.com/cprogramming/c-exercise-example80.html
该程序使用了倒推的方法,先设最后一个猴子分得的桃子数量为4的j倍,然后往前推算,求出满足条件时的桃子个数。显然这种方法更快(这种方法要算256次,而我的要算1321次)。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//
 
#include
#include
int main()
{
    int x,i=0,j=1;
    while(i<5){
        x=4*j;
        for(i=0;i<5;i++)
        {
            if(x%4!=0){break;}
            x=(x/4)*5+1;
        }
        j++;
    }
    printf("%dn",x);
    
    return 0;
}




记录我的一个低级错误:if((tmp - 1) % 5 == 1 || tmp <= 1)余数为0表示能除尽,非0表示不能(而不是为1)!!!

#include 

#define NUMBER_RANGE  100  //桃子个数最大范围
int main()
{
    int i = 0;
    int j = 0;
    int tmp = 0;
    for(i = 1; i <= NUMBER_RANGE; i++)
    {
        tmp = i;
        for(j = 0; j < 5; j++)
        {   
            if((tmp - 1) % 5 == 1 || tmp <= 1) //扔掉一个再分成5份
                break;                       //不符合要求
            tmp = (tmp - 1) / 5 * 4;         //分完第j+1次后剩下的桃子
        }
        if(j == 5)                           //符合条件
        {
            printf("原来的桃子个数最少为%dn", i);
            return 0;
        }
    }
    printf("桃子数大于%dn", NUMBER_RANGE);
    return 0;
}

错误答案:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4948436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存