100求帮忙用C语言编人猴分椰子的算法,急用,马上结贴

yangjia21_2007 2007-09-15 09:53:31
问题描述
水手分椰子问题
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水平一般再好多年没用总报错误,编不出来,请大家帮忙,有很多书上 也有这方面的 大家帮个忙
...全文
2179 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiweieng 2010-07-25
  • 打赏
  • 举报
回复
分析与解:

设开始有x个椰子,我们把x写成(x+4)-4.

第一个人来了,分给猴子1个,此时还有椰子

(x+4)-4-1=(x+4)-5,

这时恰好可分成5份,每份的椰子数为

[(x+4)-5]/5=(x+4)/5-1

(x+4)/5必须为整数,所以(x+4)是5的倍数,

第一个人拿走一份后,剩下的椰子为:

(4/5)×[(x+4)-5]=(4/5)×(x+4)-4

同样,第二个人来了,分给猴子1个,拿走一份之后,剩下的椰子数为

(4/5)×[(4/5)×(x+4)-5]

由于(4/5)×(4/5)×(x+4)是整数,故(x+4)应是5×5=25的倍数,

如此一来五个人一分一拿,恰好剩下

(4/5)×(4/5)× (4/5)×(4/5) ×(4/5) ×(x+4)-5个椰子,

故(x+4)必须是5×5×5×5×5的倍数,

即x+4=5^5

所以: x=3125-4=3121

即开始最少有3121个椰子.
yangjia21_2007 2007-09-17
  • 打赏
  • 举报
回复
的确是简单啊,但是 Treazy(活着) 的方法没什么问题,就是与题目不符合
希望大家看看,看看那题到底是什么意思,压根就理解错了,回家一看才知道,多亏改出来了。
Oscarming 2007-09-15
  • 打赏
  • 举报
回复
改成if(i==a)
break;就行了
Oscarming 2007-09-15
  • 打赏
  • 举报
回复
这个符合你要求了,但你给的数据不是最小情况,该这里就可以
if(i==a&&ok<4)
{
ok++;
k=++m;
i=1;
}
if(i==a&&ok==4)
break;
Oscarming 2007-09-15
  • 打赏
  • 举报
回复
#include<stdio.h>
int count(int);
void main()
{
int i,n,y;
printf("输入水手数:\n");
scanf("%d",&n);
y=count(n);
for(i=0;i<n;i++)
{
printf("%d\n",y);
y=(y-1)/5*4;
}

}
int count(int a)
{
int m,i,k=1,ok=0;
for(i=1;;)
{
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&&ok<4)
{
ok++;
k=++m;
i=1;
}
if(i==a&&ok==4)
break;

}
return(k*5+1);
}
yangjia21_2007 2007-09-15
  • 打赏
  • 举报
回复
你的能运行 我回去看一下代码
谢谢大家了
Treazy 2007-09-15
  • 打赏
  • 举报
回复
肯定是编译器的问题了
终于结帖了!
yangjia21_2007 2007-09-15
  • 打赏
  • 举报
回复
晕了 看来是编译器的问题,一万多应该没溢出啊

谢谢你啊 女朋友学校非要做这个,我编了半天全是语法错误就弄不下去了
谢谢大家啊 结贴了
lostbyte2006 2007-09-15
  • 打赏
  • 举报
回复
试一下
lostbyte2006 2007-09-15
  • 打赏
  • 举报
回复
#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();



}

Treazy 2007-09-15
  • 打赏
  • 举报
回复
tmp前的int 也换成long
printf("%d\n", tmp[5-count]);不变
Treazy 2007-09-15
  • 打赏
  • 举报
回复
把 int x = 1, count = 0;
int y = 5*x + 1;
换成
long x = 1, count = 0;
long y = 5*x + 1;
怀疑你的编译器的问题!
yangjia21_2007 2007-09-15
  • 打赏
  • 举报
回复
还有10分钟下班了 郁闷 应该不难啊这个
yangjia21_2007 2007-09-15
  • 打赏
  • 举报
回复
Treazy(活着)
加了也不好使 。。。
yangjia21_2007 2007-09-15
  • 打赏
  • 举报
回复
我用的是03 tc是wintc191
Oscarming(人月神话)
把你第一个的改一下就行,现在for循环那里在C不好使
Oscarming 2007-09-15
  • 打赏
  • 举报
回复
晕,我当你要判断某个数是否符合条件
Treazy 2007-09-15
  • 打赏
  • 举报
回复
你的运行环境是什么,什么os
你把
printf("%d\n", tmp[5-count]);
改成
printf("%d\n", (unsigned int)tmp[5-count]);
看看对不
yangjia21_2007 2007-09-15
  • 打赏
  • 举报
回复
Treazy(活着)
我比你着急,可是我的输出的就是我打的那些啊 怎么回事情?
帮我想一想 怎么还出先负的了
yangjia21_2007 2007-09-15
  • 打赏
  • 举报
回复
大哥,你第一个做的还有那个意思,这个根本就错了,我要求的是椰子(桃子)数,你让我输入干什么?
Treazy 2007-09-15
  • 打赏
  • 举报
回复
yangjia21_2007(年薪一万!) ( ) 信誉:100 2007-09-15 10:54:47 得分: 0


执行了一下 结果

6396
7996
-6388
-7984
6405

怎么弄的?
------------------------------------------

6396
7996
9996
12496
15621

如果是的话,那结帖吧
加载更多回复(21)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧