A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。
日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。
B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 。
C、D、E依次醒来,也按同样的方法拿鱼。
问:他们合伙至少捕了多少条鱼?以及每个人醒来时见到了多少鱼?
java代码递推实现
public static int getFish1(int[] fish,int n){
int i;
fish[0]=1;
while(true){
fish[0]=fish[0]+n;//每次增加最小n的倍数条鱼
for (i = 1; i < n; i++) {
fish[i]=(fish[i-1]-1)/n*(n-1);
if(fish[i]%n!=1){
break;
}
}
if(i==n){
return fish[0];
}
}
}
网上看到的C语言代码实现
#include <stdio.h>
int main(){
int n,x,j,k,l,m;
for(n=5;;n++)
{
j=4*(n-1)/5;
k=4*(j-1)/5;
l=4*(k-1)/5;
m=4*(l-1)/5;
if(n%5==1&&j%5==1&&k%5==1&&l%5==1&&m%5==1)
{
printf("至少合伙捕鱼:%d条\n",n);
printf("分布捕鱼条数:%d %d %d %d\n",j,k,l,m);
break;
}
}
return 0;
}
我认为for循环初始化和n++可以改一下
改成for (n = 6;; n+=5)
#include <stdio.h>
int main() {
int n, x, j, k, l, m;
for (n = 6;; n+=5)
{
j = 4 * (n - 1) / 5;
k = 4 * (j - 1) / 5;
l = 4 * (k - 1) / 5;
m = 4 * (l - 1) / 5;
if (n % 5 == 1 && j % 5 == 1 && k % 5 == 1 && l % 5 == 1 && m % 5 == 1)
{
printf("至少合伙捕鱼:%d条\n", n);
printf("分布捕鱼条数:%d %d %d %d\n", j, k, l, m);
break;
}
}
return 0;
}
网上看到的一种错误方法
#include<stdio.h>
int main()
{
/*
第五个渔夫醒来至少看到 6 条鱼,才能分五份
*/
//倒推法
int num = 6;
int i;
for(i = 1; i < 5; i++)
{
num = num*5 + 1;
//printf("%d\n", num);
}
printf("这群海王捕鱼的总数:%d\n", num);
return 0;
}
正解为3121.如果没有判断够不够分成4份,就会得出3906的错误答案。