编程猴
❶ c++编程猴子选大王 猴子按1…、n编号顺时针方向围坐一圈,从第1号开始按1、…m报数,凡报到m号的退出圈外
p=q是改变头结点,让新插入的处于链表头 如果忽略头Head->next = head就是单链表了
❷ 计算机编程c++ 猴子分桃
#include<iostream>
#include<map>
usingnamespacestd;
longlongfastpow(inta,intb){
longlongans=1;
longlongtemp=a;
while(b){
if(b&1){
ans*=temp;
}
temp*=temp;
b>>=1;
}
returnans;
}
intmain(){
intN,M;
cin>>N>>M;
longlongleft=(M-1)*(fastpow(M-1,N-1)-1);
if(left==0){
left=M-1;
}
cout<<left<<endl;
for(inti=0;i<N;i++){
if(left%(M-1)){
cout<<"ERROR:"<<left;
}
else{
left=left/(M-1)*M+1;
}
}
cout<<left<<endl;
}
❸ c语言编程:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多
#include<stdio.h>
int main(void)
{
int a,y;
long long int x=1;
scanf("%d",&a);
for(y=a;y>1;y--)
{
x=(x+y-1)*2;
}
printf("The monkey got %ld peachs in first day.\n",x);
}
❹ 编程 猴子吃桃问题 猴子第一天摘下若干个桃子当机吃了一半还不过瘾又吃了一个 以后每天早
先分析问题:用逆向思维来思考它,根据题意“以后每天早上吃前天剩下的一半零一个”,则我们可以用逆向思维来推导它,即从第十天往前推。已知第十天有一个,根据题意第九天应该就是(1+1)*2=4个,第八天应该就是(4+1)*2=10,第七天应该就是(10+1)*2=22,第六天应该就是(22+1)*2=46,
依此类推,直至第1天应该就是第2天(766+1)*=1534个桃子,即猴子第一天摘了1534个桃子。
为了验证这个推导的正确性,你可以按正常逻辑来把它(即此时由前往后)推导,即由第一天1534个桃子,第二天就是1534/2-1=766个桃子,依此类推,直至第十天,那么猴子此时就会发现只剩一个。
至此,我们由了推导的思想,再来编写的代码,就是小菜一碟的事情啦,实现的它方式无非就是那么两种,一种是简单的for循环,另一种是递归。这里我采用递归,因为解决此类问题往往用递归来思考它,会让问题变得更简单。按照数学思维来说 就是求未知数,则可以根据已知数出发进行求解(那么这里的已知数已经告诉了我们,它说第十天只有一个桃子)。
下面是我的递归算法来求解它的方法:
#include<iostream>
usingnamespacestd;
intrecurrent_monkey(intdays)//猴子吃桃递归
{
intpeach;
if(days==10)peach=1;//递归出口条件(已知条件第10天只有一个桃子)
elsepeach=(recurrent_monkey(days+1)+1)*2;
returnpeach;
}
intmain()
{
intdays=1;
cout<<recurrent_monkey(days)<<endl;
}
❺ 用matlab编程解决猴子吃桃问题
我也来凑个热闹,利用递归算法,得到桃子数目
将下面程序复制,建一个StealPeach.m文件,保存。
输入StealPeach即可
%函数StealPeach.m利用递归算法求解猴子偷桃问题
%变量说明:
% days 只剩下最后一个桃的天数
% Numbers 第一天的桃数目
% 函数没有输出,最终打印总的桃子数目
function StealPeach
days=input('请输入第几天只剩下一个桃:');
Numbers=count(1,days);
fprintf('第一天总共有桃子数目为:%5.0f\n',Numbers);
%-----------------------------------------------%
%函数count.m作为一个子函数,递归求解桃子数目
%变量说明:
% i 控制偷桃天数,起始为1
% days 只剩下最后一个桃的天数
% Numb 第一天的桃数目
function Numb=count(i,days)
if i==days %当偷桃到最后一天时,只有一个桃子
Numb=1;
return;
else %第i天拥有桃子数是i+1天的2倍,还多一个
Numb=2*count(i+1,days)+2;
end
====================================================================
其实没这么多语句的,只利用子函数,也可以的,如果你单独复制保存,然后输入 count(1,10)
运行得到的结果,也是1534
❻ 用C++编程 猴子选大王
#include <iostream>
using namespace std;
template <class datatype> class LinkList;
template <class datatype>
class Node
{
friend class LinkList<datatype>;//友元类
private:
datatype data;//计猴子号
Node<datatype> *next;
};
template <class datatype>
class LinkList
{
public:
LinkList();
void monkey(int m); //建立有m个元素的单链表
datatype Get(int a); //取单链表中第i个结点的元素值
datatype Delete(int n); //在单链表中删除第n个结点
private:
Node<datatype> *head,*tail; //单链表的结构指针
};
template <class datatype>
LinkList<datatype>:: LinkList( )
{head=new Node<datatype>; head->next=NULL;}
template <class datatype>
void LinkList<datatype>::monkey(int m)
{
int i;//整型变量i,用于计数
Node<datatype> *p,*q;//声明结构指针
p=new Node<datatype>;//为p分配空间
p->data=1; //初始化p结点data域为1
p->next=NULL;//初始化p结点next域为空
head=p;//链表头指针head赋值为p
q=p; //q赋值为p
for (i=2; i<=m; i++) //用循环结构构造链表
{
p=new Node<datatype>;//为p配内存空间
p->data=i; //初始化p结点data域为i,表示猴子号
q->next=p; //将p点加到链表尾部
q=p; //让指向链表尾部结点
p->next=NULL; //链表尾部为空
}
tail=q;//链表尾
tail->next=head;//链表尾部指向链表头,形成循环链表
}
template <class datatype>
datatype LinkList<datatype>::Delete(int n)
{
Node<datatype> *p,*q;
int j=0;
q=tail; //指向循环链表尾部
cout<<"被删除的猴子号码依次为:"<<endl;
while (q!=q->next) //剩余结点数不为1,则继续循环
{
p=q->next;//p赋值给下一个相邻结点
j++;
if(j%n==0)
{
cout<<p->data<<ends;
q->next=p->next;//删除此结点
delete p;//释放空间
p=NULL;
}
else q=p;//q指向相邻的下一个结点p
}
cout<<endl;
head=q;//head指向结点q,q为链表中剩余的一个结点
return head->data;
}
template <class datatype>
datatype LinkList<datatype>::Get(int a)
{
Node<datatype> *p;
int j;//计数器
p=head->next; j=1; //或p=head; j=0;
while (p && j<a)
{
p=p->next; //工作指针p后移
j++;
}
if (!p) throw "a值不合法";
else return p->data;
}
void main()
{
int m,n;
LinkList<int>mon;
cout<<"请输入猴子的总数:"<<endl;
cin>>m;
cout<<"请输入要删除猴子的所报的数:"<<endl;
cin>>n;
mon.monkey(m);
mon.Delete(n);
cout<<"猴王是:"<<mon.Get(1)<<"号"<<endl;
}
❼ 用matlab编程解决猴子吃桃问题
我也来凑个热闹,利用递归算法,得到桃子数目
将下面程序复制,建一个StealPeach.m文件,保存。
输入StealPeach即可
%函数StealPeach.m利用递归算法求解猴子偷桃问题
%变量说明:
%
days
只剩下最后一个桃的天数
%
Numbers
第一天的桃数目
%
函数没有输出,最终打印总的桃子数目
function
StealPeach
days=input('请输入第几天只剩下一个桃:');
Numbers=count(1,days);
fprintf('第一天总共有桃子数目为:%5.0f\n',Numbers);
%-----------------------------------------------%
%函数count.m作为一个子函数,递归求解桃子数目
%变量说明:
%
i
控制偷桃天数,起始为1
%
days
只剩下最后一个桃的天数
%
Numb
第一天的桃数目
function
Numb=count(i,days)
if
i==days
%当偷桃到最后一天时,只有一个桃子
Numb=1;
return;
else
%第i天拥有桃子数是i+1天的2倍,还多一个
Numb=2*count(i+1,days)+2;
end
====================================================================
其实没这么多语句的,只利用子函数,也可以的,如果你单独复制保存,然后输入
count(1,10)
运行得到的结果,也是1534
❽ 编程,猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上将
int day, x1, x2;
day = 9;
x2 = 1;
while (day > 0)
{
x1 = (x2 + 1) * 2; /*第一天的桃子是第二天桃子数加1后的2倍*/
x2 = x1;
day--; /*因为从后向前推所以天数递减*/
Console.WriteLine("the total is {0}", x1);
Console.ReadKey();