猴子分桃问题

一、顺推方法

用循环遍历可能的桃子总数,最开始为队员总数加一,满足1.(sum-1)%n==0 并下一次分桃时sum的值变为((sum-1)/n)*(n-1)

每个队员所面对的(上一个留下的)桃子数都可以实现分配即可,用k计数来实现,如不满足条件1跳出循环将桃子数+队员数再进行遍历。

最后对k进行判断如果k不等于队员数,同样需要更新桃子数进行再次循环,此时上次循环中的部分变量值需更新,比如k;

注意:sum的值属于每次循环的可变值,变为分配完的桃子数,需要变量x来进行桃子数+队员数

记得最后的总数因为多加了一次队员数,所以需要减去

#include<iostream>

using namespace std;

int sum;

void pitch(int n)

{

int k=0;

int x = n + 1;

while (k != n)

{

k=0;

sum = x;

for (int i = 0; i < n; i++)

{

if ((sum - 1) % n == 0&&sum!=1)

{k++;}

else {break;}

sum = ((sum - 1) / n)*(n - 1);

}

x += n;

}

cout << x- n <<" "<<sum<<endl;

}

int main()

{

int n;//队员人数

while (scanf_s("%d", &n) != EOF)

{

pitch(n);

}

system("pause");

return 0;

}

递推法实现

bool check_num(int num,int k=1){ //k标志面临桃子数可分的猴子数

if((num-1)%5!=0)return false;

if(k==5)return true;

return check_num((num-1)*4/5,++k);

}

int pitch_num(){ //返回满足条件的S1

for(int i=6;;i+=5)

if(check_num(i))return i;

}

二、逆推法

第n个面对的桃子数可分且sum%4==0即可,k作为计数判断,k!=n-1,因为前面判断过一次第n个是否可分,并且式子变为(sum/(n-1))*m+1;根据互相的递推关系不用判断是否可余5,并且每次循环变量值变化为+4.

ps.在程序开头加上#define _CRT_SECURE_NO_WARNINGS或者#pragma warning(disable:4996),可关闭安全检查,当然在oj上要去掉

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,776评论 0 33
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,916评论 0 2
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,166评论 0 41
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,478评论 1 42
  • 2017年8月5日 1.感恩爸妈的养育之恩帮助照顾孩子。 2.感恩儿子让我享受到幸福,看他照片感觉长大了会摆各种造...
    冯梓源阅读 146评论 0 0