倒推法c++

猴子分香蕉

题目

  • 5只猴子是好朋友,在海边的椰子树上睡着了。
  • 这期间,有商船把一大堆香蕉忘记在沙滩上离去。
  • 第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉。
  • 第2只猴子醒来,重新把香蕉均分成5堆,还剩下2个,就吃掉并把自己的一份藏起来继续睡觉。
  • 第3只猴子醒来,重新把香蕉均分成5堆,还剩下3个,就吃掉并把自己的一份藏起来继续睡觉。
  • 第4只猴子醒来,重新把香蕉均分成5堆,还剩下4个,就吃掉并把自己的一份藏起来继续睡觉。
  • 第5只猴子醒来,重新把香蕉均分成5堆,哈哈,正好不剩!
  • 请计算一开始最少有多少个香蕉。 需要提交的是一个整数,不要填写任何多余的内容。

代码

#include<iostream>
using namespace std;
int main(){
	//倒推法  i为猴5看到的香蕉数 
	for(int i=20;;i+=20){//猴5把香蕉刚好分成5份,该香蕉由4堆而来,故能被20整除 
		int b=i/4*5+4;//猴4看到的香蕉数 
		if(b%4) continue;
		b=b/4*5+3;//猴3看到的香蕉数
		if(b%4) continue;
		b=b/4*5+2;//猴2看到的香蕉数
		if(b%4) continue;
		b=b/4*5+1;//猴1看到的香蕉数
		cout<<"原先有香蕉的个数:"<<b<<endl;
		break; 
	}
	//顺推法,正常思维 
	for(int j=6;;j+=5){//j为原来的香蕉数 即猴1看到的香蕉数 
		int k=(j-1)/5*4;//猴2看到的香蕉数 
		if((k-2)%5) continue;
		k=(k-2)/5*4;//猴3看到的香蕉数
		if((k-3)%5) continue;
		k=(k-3)/5*4;//猴4看到的香蕉数
		if((k-4)%5) continue;
		k=(k-4)/5*4;//猴5看到的香蕉数
		if(k%5 || k==0) continue;//猴5看到的香蕉数,恰好是5的倍数,且不可能为0 
		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;
//最后剩下的人是我,p为开始报数人位置。 
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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值