这道题我也想了很久,看了网上很多方法都是直接给出公式算,我自己找了下这个问题的规律,用迭代和逆向递推的方法解决了这个问题,具体代码如下:(程序附有注释,建议大家动笔画画图,看看不同水手个数的情况是怎么样的,这样就可以理解了)
#include <stdio.h>#include<stdlib.h>
#include<math.h>
main()
{
int n //水手个数
printf("Input n(1<n<=5):\n")
scanf("%d",&n)
//增加程序的健壮性
if(n>1&&n<=5)
printf("y=%d\n",Coconu (n))
else
printf("Error!\n")
system("pause")
}
int Coconu (int n)
{
int i //内层循环变量
int j=1 //外层循环变量,
int s //原来椰子的个数
int r //迭代变量
do //第一层循环:增加最后一名水手平均分完之后的每一份椰子数,从1开始(1最小)
{
r=j*n+1 //最后一名水手总的椰子数
// 第二层循环:利用迭代及反向递推的方法求出原先的椰子数
for(i=n-1i>0i--)
{
// 在迭代过程中,如果逆向递推出现不能整除的情况,则跳出循环。(因为椰子必须是整个的)
if(r%(n-1)!=0)
break
// 迭代
s=(r/(n-1))*n+1
r=s
}
j++
}while(i!=0) //i=0则表示完成了循环,整个循环完成s才是最终的原先的椰子个数
return s
}
问题只说一半,我看了你的提问,首先是去百度了你问的是什么。。。。如果我搜索的不错,你问的问题是不是:
水手分椰子问题。五个水手发现了一堆椰子,第一个水手把椰子分成5等分,多出一个给了猴子自己藏起了一堆;第二个水手把剩下的椰子混合再分,又分为5等分,多出1个给了猴子,自己藏起1堆,第三,四个水手也同样来分第五个水手把椰子分为5等分后,正好多出1个给猴子,问这堆椰子有多少个?
如果是这个,C代码我就不写,因为我百度搜索问题的时候,也在百度文库看到了代码= =
至于你说的
3121
跟着逻辑走一遍就知道是不是了
第一水手 (float)(3121-1)/5 =624 拿走624 留下2496(624*4)
第二水手 (float)(2496-1)/5=499 拿走499 留下1996(499 *4)
第三水手 (float)(1996-1)/5=399 拿走399 留下1596(399 *4)
第四水手 (float)(1596-1)/5=319 拿走319 留下1276(319 *4)
第四水手 (float)(1276-1)/5=255 拿走255 留下1020(255*4)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)