海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只
海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同...
海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只
猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了
一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,
问海滩上原来最少有多少个桃子?
这题怎么做?
怎样编程 展开
猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了
一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,
问海滩上原来最少有多少个桃子?
这题怎么做?
怎样编程 展开
展开全部
7楼death_boy的解法很棒,一开始没看懂,尝试理解了一下:
假设最初香蕉的数量为:x,一定存在一个数:y,使得x+y=m,m能够被5整除且减去m/5后,仍旧能被5整除,如此能被整除5次(第5只猴子发现拿走),
m必定是5的倍数,最小是5^5
即 x+y=m=5^5;只要知道y的值,就能知道x的值,即x=5^5-y
m是最小值,x确定的情况下,y要尽可能小,所以y的值从1开始遍历,代码如下
using System;
namespace Fivemonkey
{
class Program
{
static void Main(string[] args)
{
int n = 5;
int x;
Program a = new Program();
for (int y =1; ; y++)
{
x = (int)Math.Pow(n, n) - y;
if (a.getRight(x))
{
Console.WriteLine(y);
Console.WriteLine(x);
break;
}
}
Console.ReadKey();
}
public bool getRight(int n)//方法:判断这个数是否满足5只猴子的分法
{
int j=0;
while (n % 5 == 1)
{
++j;
n = n - n / 5 - 1;
}
if (j < 5) { return false; }
else { return true; }
}
//下面是一般方法
/* static void Main(string[] args)
{
int n = 5;
int x;
Program a = new Program();
for (int i =1; ; i++)
{
x = (int)Math.Pow(n, n) - i;
if (a.getRight(x))
{
Console.WriteLine(i);
Console.WriteLine(x);
break;
}
}
Console.ReadKey();*/
}
}
}
输出结果:y=4,x=3121
相对于遍历x(一般方法),遍历y的次数少很多
————————————————————————————
补充:7楼直接得出y=4 ,可以这样思考,只有剩下的香蕉是5的倍数才不余,要保证剩下是5的倍数,必须拿走的也是5的倍数,如果总是余1,也就是一开始就欠4个,导致后面总是需要从5中借4(想象将香蕉5个组成一个单元的铺开)
如此推论余2 欠8 余3欠12 余4欠16
我们甚至可以求任意数猴,扔任意香蕉数的方法
展开全部
采用倒推法,再加上整除性,第5只猴子应分得4^4-1=255个桃子,第4只猴子应分得(4^4*5-5+1)/4=4^3*5-1个桃子,第3只猴子应分得(4^3*5*5-5+1)/4=4^2*5^2-1个桃子,第2只猴子应分得(4^2*5^2*5-5+1)/4=4*5^3-1个桃子,第1只猴子应分得(4*5^3*5-5+1)/4=5^4-1个桃子。那么,原来总共有桃子5^4*5-5+1=5^5-4=3121个桃子。
运行示例:
./monkey 5
运行结果:
total=3121
程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char **argv)
{
int monkey_num;
double total;
if (argc < 2)
{
fprintf(stderr, "Usage: %s <monkey_num>\n", argv[0]);
return 1;
}
monkey_num = atoi(argv[1]);
total = pow(monkey_num, monkey_num) - monkey_num + 1;
printf("total=%.16lg\n", total);
return 0;
}
运行示例:
./monkey 5
运行结果:
total=3121
程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char **argv)
{
int monkey_num;
double total;
if (argc < 2)
{
fprintf(stderr, "Usage: %s <monkey_num>\n", argv[0]);
return 1;
}
monkey_num = atoi(argv[1]);
total = pow(monkey_num, monkey_num) - monkey_num + 1;
printf("total=%.16lg\n", total);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
告诉楼主一个简单的办法
设原来有:5X+1
第一只拿走后还有:4X(设4X=5Y+1,下同)
第二只拿走后还有:4Y=5Z+1
第三只拿走后还有:4Z=5M+1
第四只拿走后还有:4M=5N+1
则第五只猴拿走的桃子为:N个
楼主可假设N=1,2,3....
直至使得X,Y,Z,M均为整数即符合题意.
设原来有:5X+1
第一只拿走后还有:4X(设4X=5Y+1,下同)
第二只拿走后还有:4Y=5Z+1
第三只拿走后还有:4Z=5M+1
第四只拿走后还有:4M=5N+1
则第五只猴拿走的桃子为:N个
楼主可假设N=1,2,3....
直至使得X,Y,Z,M均为整数即符合题意.
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果多了4个,那么没有桃子被扔入海中,最小的是5^5=3125。所以应该是5^5-4=3121
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
5*5*5*5*5 +5*5*5*5 +5*5*5+ 5*5 +5 +1=
你算出来就是结果!
你算出来就是结果!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询