100求帮忙用C语言编人猴分椰子的算法,用,马上结贴解决办法
100求帮忙用C语言编人猴分椰子的算法,急用,马上结贴
问题描述
水手分椰子问题
5个水手在椰岛上发现拉一堆椰子:先由第一名水手把椰子分成等量的5堆,还剩下一个
给猴子,自己藏一堆,然后,第二个水手把剩下4堆混合后重新分成等量的5堆。还剩下一个
个猴子,自己藏起一堆,以后第3,4个水手依此办理,最后第5个水手把剩下的椰子分成等量
的5堆后同样剩下一个给猴子。。。
算法分析:利用迭代法,若某水手面临y个椰子,则他前一个水手面对的是 y*5/4+1个椰
子,依次类推。若对某一个整形y经过上述5次迭代都是整数,最后的结果即是所求。
于是,x取值从1开始,y取值从5x+1开始,按y*5/4+1进行5次迭代中若某一次不是整形则返回x曾1,再试,直到5次迭代的y全是整数,打印输出y。。
一般地,对n(n> 1)个水手,按y*n(n-1)+1进行迭代可得n个水手分椰子问题的解。
那位能用C帮忙编出来,小弟一直用C#,C水平一般再好多年没用总报错误,编不出来,请大家帮忙,有很多书上 也有这方面的 大家帮个忙
------解决方案--------------------
#include <iostream.h>
int count(int);
void main()
{
int n;
cout < < "输入猴子数: ";
cin> > n;
cout < < "至少摘了 " < <count(n) < < "个桃子 " < <endl;
}
int count(int a)
{
int k=1;//到数第1个猴子分的每堆桃子有k个
for(int i=1,m;;)//第i只猴子
{
if(i==1)
m=k;
if((k*5+1)%4==0)
{
k=(k*5+1)/4;
i++;
}
else
{
k=++m;
i=1;
}
if(i==a)//共a只猴子
break;
}
return(k*5+1);
}
------解决方案--------------------
main()
{
int x = 1, count = 0;
int y = 5*x + 1;
int tmp[5];
while(1)
{
if((y*5%4) != 0)
{
x++;
y = 5*x + 1;
count = 0;
continue;
}
else
{
y = 1 + y*5/4;
tmp[count++] = y;
if(count == 5)
{
break;
}
}
}
for(; count > 0; count--)
{
printf( "%d\n ", tmp[5-count]);
}
}
看看这吧!
------解决方案--------------------
#include <stdio.h>
void coconut()
{
int x,y,k,m,count;
for(x=4;x <10000;x+=4)
{
count=0;
m=x;
for(k=0;k <5;k++)
{
y=x*5/4+1;
x=y;
if(y%4==0)
count++;
else
break;
}
x=m;//恢复x值
if(count==4)
{
printf( "%3d %3d\n ",y,x);
break;
}
}
}
void main()
{
coconut();
}
问题描述
水手分椰子问题
5个水手在椰岛上发现拉一堆椰子:先由第一名水手把椰子分成等量的5堆,还剩下一个
给猴子,自己藏一堆,然后,第二个水手把剩下4堆混合后重新分成等量的5堆。还剩下一个
个猴子,自己藏起一堆,以后第3,4个水手依此办理,最后第5个水手把剩下的椰子分成等量
的5堆后同样剩下一个给猴子。。。
算法分析:利用迭代法,若某水手面临y个椰子,则他前一个水手面对的是 y*5/4+1个椰
子,依次类推。若对某一个整形y经过上述5次迭代都是整数,最后的结果即是所求。
于是,x取值从1开始,y取值从5x+1开始,按y*5/4+1进行5次迭代中若某一次不是整形则返回x曾1,再试,直到5次迭代的y全是整数,打印输出y。。
一般地,对n(n> 1)个水手,按y*n(n-1)+1进行迭代可得n个水手分椰子问题的解。
那位能用C帮忙编出来,小弟一直用C#,C水平一般再好多年没用总报错误,编不出来,请大家帮忙,有很多书上 也有这方面的 大家帮个忙
------解决方案--------------------
#include <iostream.h>
int count(int);
void main()
{
int n;
cout < < "输入猴子数: ";
cin> > n;
cout < < "至少摘了 " < <count(n) < < "个桃子 " < <endl;
}
int count(int a)
{
int k=1;//到数第1个猴子分的每堆桃子有k个
for(int i=1,m;;)//第i只猴子
{
if(i==1)
m=k;
if((k*5+1)%4==0)
{
k=(k*5+1)/4;
i++;
}
else
{
k=++m;
i=1;
}
if(i==a)//共a只猴子
break;
}
return(k*5+1);
}
------解决方案--------------------
main()
{
int x = 1, count = 0;
int y = 5*x + 1;
int tmp[5];
while(1)
{
if((y*5%4) != 0)
{
x++;
y = 5*x + 1;
count = 0;
continue;
}
else
{
y = 1 + y*5/4;
tmp[count++] = y;
if(count == 5)
{
break;
}
}
}
for(; count > 0; count--)
{
printf( "%d\n ", tmp[5-count]);
}
}
看看这吧!
------解决方案--------------------
#include <stdio.h>
void coconut()
{
int x,y,k,m,count;
for(x=4;x <10000;x+=4)
{
count=0;
m=x;
for(k=0;k <5;k++)
{
y=x*5/4+1;
x=y;
if(y%4==0)
count++;
else
break;
}
x=m;//恢复x值
if(count==4)
{
printf( "%3d %3d\n ",y,x);
break;
}
}
}
void main()
{
coconut();
}