C 练习实例80
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?
程序分析:无。
程序源代码:
实例
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
int main() {
int n = 0; // n 表示初始桃子数
int i, count;
int found = 0;
while (!found) {
n += 1; // 假设初始桃子数
count = n;
for (i = 0; i < 5; i++) {
if ((count - 1) % 5 == 0) {
count = (count - 1) / 5 * 4;
} else {
break;
}
}
if (i == 5) {
found = 1;
}
}
printf("最少有 %d 个桃子。\n", n);
return 0;
}
以上实例运行输出结果为:
3121
C 语言经典100例
zhapu
zha***163.com.cn
参考方法:
#include<stdio.h> #include<stdlib.h> int calc_peaches(int monkeys) { //猴子总数 int m = monkeys; //猴子每次待分桃子数 int remain; int i = 1; while(1) { //最后一只猴子待分配的桃子数一定能被4整除 remain = 4 * i; for (m=monkeys; m>0; m--) { // 每只猴子待分配的桃子数remain,满足(remain - 1) % 5 = 0 if ((remain - 1) % 5 != 0) break; // 除第一只猴子外,其他猴子待分配的桃子数remain,满足remain % 4 = 0 if (m > 1 && remain % 4 != 0) break; // 不是第一只猴子时,计算出上一只猴子待分配的桃子数 if (m > 1) remain = remain*5/4 + 1; else break; } // 待分配的桃子已满足monkeys只猴子的分配要求 if (m == 1) break; // 不满足时,则说明最后一只猴子待分配的桃子数不对,更换后再试 else i++; } return remain; } int main(void) { int monkeys; printf("请输入猴子的数量: "); scanf("%d", &monkeys); printf("桃子总数: %d\n", calc_peaches(monkeys)); }zhapu
zha***163.com.cn
公子小乔
257***3424@qq.com
设最少有 x 个桃子:
从 e 反推到 x 必须是一个连续的过程,如果中间有间断,就必须返回 e+1 重新计算。
#include <stdio.h> #define True 1 int main() { int monkeys = 5, remain_peach = 1, i, temp, k; for (i = 0; i < monkeys;) // i=0表示第5只猴子 { int flag = 0; // flag=0表示没有间断 while (True) { temp = remain_peach * 5 % 4; if (temp == 0) { if (i == 0) // 这里需要注意,只有在计算第五只猴子的时候需要保留现场 k = remain_peach; remain_peach = remain_peach * 5 / 4 + 1; if (i == 0 || (flag == 0 && i != 0)) // 如果当前计算的是第五只猴子,或者不是第五只但是没有间断,就计算前一只猴子 { i++; break; } } else { flag = 1; if (i != 0) // 表示间断,且不是第五只猴子,那么就需要返回第五只猴子重新计算 { i = 0; remain_peach = k + 1; // 防止死循环 break; } remain_peach++; } } } printf("最少有 %d 个桃子", remain_peach); }公子小乔
257***3424@qq.com