jayj 发表于 2006-4-13 22:33

帮帮忙!大家帮我看下用什么算法!我想用递归的!但不知道从合做起!!

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?(要用C语言啊)

[ 本帖最后由 jayj 于 2006-4-13 23:07 编辑 ]

powerwind 发表于 2006-4-13 23:05


#include<iostream>
using namespace std;

int main()
{
    int x=1;
    for(int i=0;i<5;i++)
    x=x*5+1;
    cout<<x<<endl;
}


不知这样行不行?

COD 发表于 2006-4-13 23:59

楼上的肯定错了.楼主,最后还剩多少桃知不知道?

powerwind 发表于 2006-4-14 00:12

我是错了.
再想想!

jayj 发表于 2006-4-14 12:58

不知道剩下多少的!

如果知道我都会做了!!

gyCai 发表于 2006-4-14 16:15

这道题好像最后有两个未知数,只能求出范围,无法得到一个确切的结果。大家可以从数学方面考虑一下。

xiezixu1983 发表于 2006-4-14 16:18

范围? 那就行了吧 题目要求最小值

gyCai 发表于 2006-4-14 17:05

#include<stdio.H>
int p(int x,int y);
static int k;

void main()
{
    int re,i;
        for(i=1;i<5000;i++)
        {
      k=0;
      re=p(i,5);
                if(k==6)
                {
                        printf("resule is %d\n",re);
                  break;
                }
        }
}

int p(int x,int y)
{
   int a;
   k++;
   if(y>0)
   {
           if((x-1)%5==0)
           {
          a=(x-1)*4/5;
          p(a,y-1);
           }
   }
   return x;
}

[ 本帖最后由 gyCai 于 2006-4-14 17:31 编辑 ]

jayj 发表于 2006-4-14 17:05

那就写算法给我啊!

做啊!

gyCai 发表于 2006-4-14 17:06

运行结果为3121

gyCai 发表于 2006-4-14 17:09

老大,数学计算是一回事儿,要把它用程序表达出来又是另外一回事儿了。不知道对不对呢?

jayj 发表于 2006-4-14 17:14

好象不对啊!你定义int的,怎么结果是3121啊?!

范围都溢出了!

gyCai 发表于 2006-4-14 17:22

int 的范围在普通的32位计算机上(IBM和Intel)是-32768~32767

gyCai 发表于 2006-4-14 17:26

我这个算法其实不能说是真正意义上的递归,其中还用了类似于穷举的东西,如果单纯用递归我做不出来。还忘wool王和hjack等高手指点一下。
谢谢

[ 本帖最后由 gyCai 于 2006-4-14 17:34 编辑 ]

jayj 发表于 2006-4-14 17:35

你QQ号码多少?

还有很多问题!

黯然销魂 发表于 2006-4-14 18:59

//Flash ActionScript 1.0
//逆归, 穷举范围1~500
function getAmount(monkeyCount, lastCount) {
        var eachCount;
        if (monkeyCount == 1) {
                eachCount = lastCount;
        } else {
                eachCount = getAmount(monkeyCount-1, lastCount)/4;
        }
        return eachCount*5+1;
}
var tempCount;
for (i=1; i<=500; i++) {
        tempCount = getAmount(5, i);
        if ((tempCount-Math.floor(tempCount)) != 0) {
                continue;
        } else {
                trace("共有"+tempCount+"只桃子, 最后一只猴子那份有"+i+"只桃子.");
                break;
        }
}


output:
共有3121只桃子, 最后一只猴子那份有255只桃子.

黯然销魂 发表于 2006-4-14 19:05

//Flash ActionScript 1.0
//完全逆归版
function getAmount(monkeyCount, lastCount) {
        var eachCount;
        if (monkeyCount == 1) {
                eachCount = lastCount;
        } else {
                do {
                        eachCount = getAmount(monkeyCount-1, lastCount)/4;
                        if ((eachCount-Math.floor(eachCount)) != 0) {
                                lastCount++;
                                flag = true;
                        } else {
                                flag = false;
                        }
                } while (flag == true);
        }
        return eachCount*5+1;
}
trace("共有"+getAmount(5, 1)+"只桃子.");

output:
共有3121只桃子.

黯然销魂 发表于 2006-4-14 19:11

呀, 楼主居然要C语言的...写法参照我第二个版本...在递归函数内部判断是否为整数即可.

黯然销魂 发表于 2006-4-14 19:20


/*C Edition*/
#include <stdio.h>
int getamount(int monkeycount, int lastcount){
        int eachcount;
        int tempcount;
        int flag;
        if(monkeycount==1)
                eachcount=lastcount;
        else{
                do{
                        tempcount=getamount(monkeycount-1,lastcount);
                        if(tempcount%4==0){
                                eachcount=tempcount/4;
                                flag=0;
                        }else{
                                lastcount++;
                                flag=1;
                        }
                }while(flag);
        }
        return eachcount*5+1;
}
main(){
printf("There are %d peaches!\n",getamount(5,1));
}

output:
There are 3121 peaches!

[ 本帖最后由 黯然销魂 于 2006-4-15 23:44 编辑 ]

黯然销魂 发表于 2006-4-14 19:22

注, 第2个参数表示最后一只猴子每份的个数.
页: [1] 2
查看完整版本: 帮帮忙!大家帮我看下用什么算法!我想用递归的!但不知道从合做起!!