这题怎么做啊
这题怎么做啊,算法的不会啊 这个数学问题呀我有一个想法
因为是求至少是多少只,不妨第五个野人分的鸟的数量是6只
因为 这六只是第4个野人分五份扔一只后拿走其中一份剩下的,那么第四人分的鸟的数量应该是 5 除以 五分之四 加一
后面的以此类推
数学较差,有误请指教 从后面倒数回来就好 ,假设最后的为N,那么第五个人就是5*(N+1),第四个就是5*(5*(N+1)+1),第三个5*(5*(5*(N+1)+1)+1),第二个5*(5*(5*(5*(N+1)+1)+1)+1),第一个5*(5*(5*(5*(5*(N+1)+1)+1)+1)+1),再把N最小代入 大马强 发表于 2021-9-13 21:48
这个数学问题呀
我有一个想法
因为是求至少是多少只,不妨第五个野人分的鸟的数量是6只
都是整只的,没有小数
第五人最少有16只,也就是第四人分了5组(先不管他扔掉的那只,这个是在确定第五人的数量),拿走了一组后剩下的4组,共16只
第五人共16只,分成5组,每组3只余的1就是被扔掉的那只 如图,注意注释,用逆向思维反过来写 本帖最后由 傻眼貓咪 于 2021-9-14 10:36 编辑
一共 296 隻鳥
野人醒來順序 鳥的數量 丟掉1隻,再平分5人,扣除野人拿走自己那份
第一個野人醒來 296 (59+59+59+59+59-1)/5
第二個野人醒來 236 (47+47+47+47+47-1)/5
第三個野人醒來 141 (28+28+28+28+28-1)/5
第四個野人醒來 56 (11+11+11+11+11-1)/5
第五個野人醒來 11 (2+2+2+2+2-1)/5
第一個野人拿走 59 隻鳥
第二個野人拿走 47 隻鳥
第三個野人拿走 28 隻鳥
第四個野人拿走 11 隻鳥
第五個野人拿走 2 隻鳥
好像也不對{:5_99:} 傻眼貓咪 发表于 2021-9-14 00:35
本帖最后由 傻眼貓咪 于 2021-9-14 00:38 编辑
一共 296 隻鳥
236-48=188 int main( )
{
int i=6,j=0,n=0,m=0;
while (true)
{
n=i;
for ( j = 0; j < 5; j++)
{
if (1!=n%5)break;
m=(n-1)/5;
n--;
n-=m;
}
if (5==j)
{
break;
}
i++;
}
return 0;
}
3121不知道对不对 傻眼貓咪 发表于 2021-9-14 00:35
本帖最后由 傻眼貓咪 于 2021-9-14 00:38 编辑
一共 296 隻鳥
你确定是这样的? {:10_277:} 学习了{:5_95:} 你这题和菜鸟教程的题非常像,建议你去看一下。
这个属于数学问题。只要把数学问题搞定了,程序自然就出来了。
如果只是给 你程序,数学问题没解决,下次你碰到这样的问题,你还是不会。 本帖最后由 jhanker 于 2021-9-14 09:46 编辑
#include <stdio.h>
int main()
{
int i,j,k;
for(i=1;;i++)//设最后分到手每个人 i 只
{
k=i*5+1; //倒推第一次
for(j=1;j<5;j++) //倒推分四次 j表示倒推次数
{
if(k%4==0)
k=k/4*5+1;
else
break;
}
if(k%5==1 && j==5 )
{
printf("野人一个打了%d只鸟",k);
break;
}
}
return 0;
}
本帖最后由 村里小黑 于 2021-9-14 09:50 编辑
int main()
{
unsigned int i=0,j=0,k=0,n=0,m=0;
for(i=0;i<20000;i++)
{
for(j=1;j<6;j++)
{
n=i-j*(k+1);
k=n-k/5;
m=k%5;
if(m!=0)
{
j=7
}
if(j==5&&m==0)
{
printf("%d",i);
i=20001;
}
}
}
}
刚看到敲得,不知道是否正确,欢迎指正 对不对没算过,你可以自己算算看。这是反推的算法,前面楼上的正推的算法你也可以试试 3121.0
6246.0
9371.0
12496.0
15621.0
18746.0
21871.0
24996.0
28121.0
31246.0
34371.0 jhq999 发表于 2021-9-14 07:41
236-48=188
好像也不對{:5_99:} 心驰神往 发表于 2021-9-14 08:15
你确定是这样的?
好像也不對{:5_99:} 本帖最后由 jhq999 于 2021-9-14 11:00 编辑
jhanker 发表于 2021-9-14 09:39
#include <stdio.h>
int main()
{
int i,j,k;
for(i=1;;i++)//设最后分到手每个人 i 只
{
k=i*5+1; //倒推第一次
for(j=1;j<5;j++) //倒推分四次 j表示倒推次数
{
if(k%4==0)
k=k/4*5+1;
else
break;
}
if(k%5==1 && j==5 )
{
printf("野人一个打了%d只鸟",k);
break;
}
}
return 0;
}
k%4==0的由来:
f(k)-1-(f(k)-1)/5=f(k-1)
=>4f(k)-4=5*f(k-1)
=>f(k)=(5*f(k-1))/4+1
=》f(k)要想得到整数解f(k-1)必须被4整除 for i in range(1,1000): #第五个人拿走鸟的数量区间
s = i * 5 + 1
n = 1
while n < 4:
t = s / 4
s = t*5 + 1
n += 1
if s%4 != 0:
break
if s%4 == 0 and n == 4:
t = s / 4
s = t*5 + 1
print(s){:10_302:}{:10_302:}{:10_302:}{:10_302:}{:10_302:}{:10_302:}
3121.0
6246.0
9371.0
页:
[1]
2