日期:2014-05-20  浏览次数:20580 次

渔夫分鱼算法的实现
A,B,C,D,E五个渔夫夜间合伙捕鱼,凌晨都疲惫不堪,各自在草丛中熟睡。
第二天清晨

A先醒来,他把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,
B醒来后,也把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,
C,D,E也按同样方法分鱼。问5人至少捕到多少条鱼?

请给出代码。。。。

------解决方案--------------------
Java code
public class Csdn {

    public static void main(String[] args){
        for (int i = 0;; i++) {
            int sum = i;
            for (int j = 0; j < 5; j++) {
                if (sum % 5 == 1)
                    sum = (sum / 5)*4;
                else
                    sum = 0;
            }
            if (sum != 0) {
                System.out.println(i);
                break;
            }
        }
    }


}

------解决方案--------------------
Java code
public class test {
public static void main (String[] arge) {
int i=0;
do{
i++;
if ( f (5,i*5+1) ) {
System.out.println (i*5+1);
System.exit (0);
}
}
while(true);
}
public static boolean f (int a,int b) {
if ( (b-1)%5==0 ) {
if (a==1) return true;
else return f (a-1,(b-1)/5*4);
}
return false;
}
}

------解决方案--------------------
这个好像是猴子分桃吧,怎么成渔夫了
------解决方案--------------------
C/C++ code

main(){
int n,i,x,flag=1;
for(n=6;flag;n++){
for(x=n,i=1;flag&&i<=5;i++)
if((x-1)%5==0)x=4*(x-1)/5;
else flag=0;
if(flag)break;
else flag=1;
}
printf("Total fish=%d\n",n);
}

------解决方案--------------------
探讨
Java codepublic class Csdn {

public static void main(String[] args){
for (int i = 0;; i++) {
int sum = i;
for (int j = 0; j < 5; j++) {
if (sum % 5 == 1)
sum = (sum / 5)*4;
else
sum = 0;
}
if (sum != 0) {
System.out.println(i);


------解决方案--------------------
n mod 5=1
第一个拿走自己的一堆后同样除5余1,
即4k mod 5=1,
所以 k mod 5 =4
同理,第二个、第三个……都是4堆余1,自然一堆余4
这正是“除基数取余”的方法,所以答案就是5进制的 44441
(44441)5=3121D


---------------
(44441)5 / (10)5=(4444)5 余1(5)
(4444/4堆)5 mod (10)5=(1111)5mod(10)5=4

------解决方案--------------------
呵呵。来学习
------解决方案--------------------
public class test {
public static void main (String[] arge) {
int i=0;
do{
i++;
if ( f (5,i*5+1) ) {
System.out.println (i*5+1);
System.exit (0);
}
}
while(true);
}
public static boolean f (int a,int b) {
if ( (b-1)%5==0 ) {
if (a==1) return true;
else return f (a-1,(b-1)/5*4);
}
return false;
}
}

这个递归是正确的
------解决方案--------------------
呵呵,偶也进来学习了一下啊。
------解决方案--------------------
((((1*5+1)*5+1)*5+1)*5+1)*5+1 = 5^5+5^4+5^3+%^2+5^1+1 = (5^6-1)/(5-1) = (5^3+1)*(5^3-1)/(5-1)=126*124/4=126*31=3780+126=3906
------解决方案--------------------
代码:
Java code
public class Fy {

    /**
     * 求解渔夫分鱼问题(穷举法)。
     * @param num 渔夫数。
     * @param mod 每次丢掉鱼数。
     * @return 这些渔夫至少捕到多少条鱼能使条件成立。
     */
    public static int fy(final int num, final int mod) {
        if (num < 1 || mod < 1) return -1;
        int min = num + mod;
        while (min < Integer.MAX_VALUE) {
            int m = min;
            int i = num;
            do {
                if (m % num != mod) break;
                m -= mod;
                m -= m / num;
            } while (--i > 0);
            if (i == 0) return min;
            ++min;
        }
        return -1;
    }

    public static void main(String[] args) {
        System.out.println(fy(5, 1));
    }

}