文章目录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; }
错误答案:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)