一C++程序求助

2025年03月18日 00:48
有3个网友回答
网友(1):

***********************************************************
************************ 答案: 3121 ***********************
***********************************************************

思路一: (逆)
假设还有最后第6个猴子F,最后剩下给它的果子数为f=last(剩下的可能是f=0).
那么可知,E得到的果子数是:e=4*f(e为整数,因为果子数是整的),由这里可见: f是4的倍数!!!!!!!!!(注意这里,这是程序里f=0;f=f+4的原因!!)
于是 D 分到的果子数是:d=(5*e+1)/4;
同理:c=(5*d+1)/4; b=(5*c+1)/4; a=(5*b+1)/4 ;

思路二: (正)
假设分前的果子数为fisrt,A分到的果子数为a=(first-1)/5+1,这里可见(first-1)%5==0也就是5的倍数!!(因为果子数是整数)
b=(4*(a-1)-1)/5+1,同理,c=(4*(b-1)-1)/5+1,d=(4*(c-1)-1)/5,e=(4*(d-1)-1)/5+1

**********(到最后我们试着比较两个思路的出的程序各有什么优缺点??)**********

******************程序本身不多-注释挺详细******************

C++程序实现: (逆)
#include
using namespace std;
int fenyu(int e,int n) ;
void main()
{
int f,n=5,first;
for(f=0;!(first=fenyu(f/4,n));f+=4) ;
cout<<"first="< <<" last="<}
int fenyu(int e,int n)
{/* e:表示第n个猴子的果子数; n:表示他是第n个分的,因每个猴子分到的果子是整数,所以(5*e+1)是4的倍数,故用整除*/
if(n==1) return (5*e+1); /*** n==1 返回 未分前的果子数目 ***/
else if((5*e+1)%4==0) return fenyu((5*e+1)/4,n-1); /*递归检验前一个猴子得到的果子是不是整数*/
else return 0; /**** 只要分到的果子不是整数,就返回0 ***/
}

C++程序实现:(正)
#include
using namespace std;
int fenyu(int a,int n) ;
void main()
{
int f,last;
for(f=1;!(last=fenyu(f/5+1,1));f+=5) ;
cout<<"first="< <<" last="<}
int fenyu(int a,int n)
{/* first:表示第n个猴子的果子数; n:表示他是第n个分的,因每个猴子分到的果子是整数,所以(5*e+1)是4的倍数,故用整除*/
if(n==5) return 4*(a-1); /*** 返回 最后剩余的果子数目 ***/
else if((4*(a-1)-1)%5==0) return fenyu((4*(a-1))/5+1,n+1); /*递归检验前一个猴子得到的果子是不是整数*/
else return 0; /**** 只要分到的果子不是整数,就返回0 ***/
}

现在说说,这两种相反思路,编写的不同:
顺向思路:
for()中的循环是以开始的果子数为循环量,从答案来看,需要3121次循环, 但由于分配前果子量是A得到果子数的(a-1)的5倍多1个,也就是说,分配前果子量减1整除5,这样,就变成了(3121-1)/5=624次循环!!!!

而反向思路:
for()中的循环是以剩余的果子数为循环量,从结果来看,理论需要1020次循环,但由于剩余量是E得到果子数的4倍,也就是说,剩余量整除4,这样,就变成了1020/4=255次循环!!!!

当然并不是说这就很好,还有其他更好的!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!! The End !!!!!!!!!!!!!!!!!!!!!!!!!!!
最后PS一下,如需要了解本题的 "数学解法" ,请参照:
http://zhidao.baidu.com/question/12936961.html

网友(2):

#include
int i=0,total=0;
num(int n)
{
++i;
total+=n;
if(i==5)return 0;
else return (num(5*n+1));
}
void main()
{
int k=6;
num(k);
cout<}
原题是求这堆桃原来至少有多少个,掉了“至少”是没办法做的。
要至少,则最后一只猴必须拿1个,所以它来的时候就有(1*5+1)个
依次类推,求总数total.

网友(3):

最后一个猴子拿走了几个啊?递归要有递归规则,还有递归结束条件啊。你等到1的时候结束,但是结束的时候状态呢?

递归规则是:

总数(f)=(总数(f-1)×f/(f-1))+1

递归结束状态

总数(1)=多少啊?

#include

sum(int n)
{

if n=1
return ‘你需要提供这个值’;
else
return sum(n-1)*n/(n-1)+1
}
void main()
{
int k=5;
cout<}