猴子分香蕉
题目
- 5只猴子是好朋友,在海边的椰子树上睡着了。
- 这期间,有商船把一大堆香蕉忘记在沙滩上离去。
- 第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉。
- 第2只猴子醒来,重新把香蕉均分成5堆,还剩下2个,就吃掉并把自己的一份藏起来继续睡觉。
- 第3只猴子醒来,重新把香蕉均分成5堆,还剩下3个,就吃掉并把自己的一份藏起来继续睡觉。
- 第4只猴子醒来,重新把香蕉均分成5堆,还剩下4个,就吃掉并把自己的一份藏起来继续睡觉。
- 第5只猴子醒来,重新把香蕉均分成5堆,哈哈,正好不剩!
- 请计算一开始最少有多少个香蕉。 需要提交的是一个整数,不要填写任何多余的内容。
代码
#include<iostream>
using namespace std;
int main(){
for(int i=20;;i+=20){
int b=i/4*5+4;
if(b%4) continue;
b=b/4*5+3;
if(b%4) continue;
b=b/4*5+2;
if(b%4) continue;
b=b/4*5+1;
cout<<"原先有香蕉的个数:"<<b<<endl;
break;
}
for(int j=6;;j+=5){
int k=(j-1)/5*4;
if((k-2)%5) continue;
k=(k-2)/5*4;
if((k-3)%5) continue;
k=(k-3)/5*4;
if((k-4)%5) continue;
k=(k-4)/5*4;
if(k%5 || k==0) continue;
cout<<"原来有香蕉的个数:"<<j<<endl;
break;
}
return 0;
}
分钱游戏
题目
- 甲、乙、丙三人共有24元钱,
- 先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;
- 接着由乙分给甲、丙,分法同前;
- 再由丙分钱给甲、乙,分法亦同前。
- 经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?
代码
#include<iostream>
using namespace std;
int main(){
int a=8;
int b=8;
int c=8;
a/=2;b/=2;c=a+b+c;
a/=2;c/=2;b=a+b+c;
b/=2;c/=2;a=a+b+c;
cout<<"甲"<<a<<"乙"<<b<<"丙"<<c<<endl;
return 0;
}
约瑟夫环
题目
- 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到最后一个人。
思路
- 由最后一个人开始倒推。
- 每次删除的都是喊3的人,即喊1的前一个人。
- 找到位置p与当前人数n的关系p=(p+N)%n。
- 当倒推回M个人的时候,循环结束。
#include<iostream>
using namespace std;
int main(){
int M=10;
int N=3;
int n=1;
int p=0;
while(n<M){
n++;
p=(p+N)%n;
}
cout<<p+1;
return 0;
}