拈花小仙 发表于 2014-9-5 17:27:02

小仙趣题分享-38

话说某天一艘海盗船被天下砸下来的一头牛给击中了,5个倒霉的家伙只好逃难到一个孤岛,发现岛上孤零零的,幸好有有棵椰子树,还有一只猴子!大家把椰子全部采摘下来放在一起,但是天已经很晚了,所以就睡觉先.晚上某个家伙悄悄的起床,悄悄的将椰子分成5份,结果发现多一个椰子,顺手就给了幸运的猴子,然后又悄悄的藏了一份,然后把剩下的椰子混在一起放回原处,最后还是悄悄滴回去睡觉了.过了会儿,另一个家伙也悄悄的起床,悄悄的将剩下的椰子分成5份,结果发现多一个椰子,顺手就又给了幸运的猴子,然后又悄悄滴藏了一份,把剩下的椰子混在一起放回原处,最后还是悄悄滴回去睡觉了.又过了一会 ......又过了一会 ...总之5个家伙都起床过,都做了一样的事情 早上大家都起床,各自心怀鬼胎的分椰子了,这个猴子还真不是一般的幸运,因为这次把椰子分成5分后居然还是多一个椰子,只好又给它了.问题来了,这堆椰子最少有多少个?

andalousie 发表于 2014-9-7 10:04:25

本帖最后由 andalousie 于 2014-9-7 10:13 编辑

@拈花小仙 小仙姐,这道题是编程题吧,数有点大。
1) 由于4和5互质,从20以内的数里面可以找到唯一能整除4且除以5余一的数,也就是16;根据中国剩余定理,可以知道任何20m+16 (m是自然数)都满足“能整除4且除以5余一”这一条件。
2) 在前面五次拿椰子以后,剩下的椰子数都满足上面1)中的条件。所以每次拿剩下的椰子数应为20m+16。
3) 假设其中一次后剩下的为20k+16,那么分之前必然是25k+21。而这又是上一次分剩下的。于是需要满足:
于是得到:
此外,可以得到,分之前的k'的值与分之后的k值之间的关系为
->于是,我写了一个程序来进行求解#include <iostream>

int mem;

bool check_it(int k) {
    bool result = true;
    mem = k + k / 4 + 1;
    for (int i = 0; i < 4; ++i) {
      if (mem % 4 != 3) {
            result = false;
            break;
      }
      mem = mem + mem / 4 + 1;
    }
    return result;
}

int main() {
    int base = 3;
    while (!check_it(base)) {
      base += 4;
    }
    std::cout << 20 * mem + 16 << std::endl;
}得出的结果是62496

小甲鱼 发表于 2014-9-5 17:33:38

{:7_122:}这出得也忒快丫~

拈花小仙 发表于 2014-9-7 15:29:35

andalousie 发表于 2014-9-7 10:04
@拈花小仙 小仙姐,这道题是编程题吧,数有点大。
1) 由于4和5互质,从20以内的数里面可以找到唯一能整除4 ...

@小甲鱼 老师,我发现各种趣题太适合锻炼编程水平了~

小甲鱼 发表于 2014-9-7 20:43:53

拈花小仙 发表于 2014-9-7 15:29
@小甲鱼 老师,我发现各种趣题太适合锻炼编程水平了~

{:5_106:}这位童鞋小哥真是活学活用啊~

拈花小仙 发表于 2014-9-7 22:03:58

andalousie 发表于 2014-9-7 10:04
@拈花小仙 小仙姐,这道题是编程题吧,数有点大。
1) 由于4和5互质,从20以内的数里面可以找到唯一能整除4 ...

@Angel丶L @仰望天上的光 @牡丹花下死做鬼

牡丹花下死做鬼 发表于 2014-9-7 22:30:47

#include<stdio.h>

int main()
{
        int i=1,r=1,j;
        while(r%4 != 0)
        {
s:                r = i*5+1;
                i++;
        }

        for(j = 1;j<6;j++)
        {
                r = r*1.25+1;
                if(r%4 != 0)
                {
                        goto s;
                }
        }

        printf("%d\n",r);

        return 0;
}

牡丹花下死做鬼 发表于 2014-9-7 22:31:32

答案是 62496

andalousie 发表于 2014-9-7 23:01:21

看这个程序,有人能告诉我是为什么的吗
#include <iostream>

int main() {
    int mem = 3;
    for (int i = 0; i < 4; ++i) {
      mem = 5 * mem + 4;
    }
    mem = mem + mem / 4 + 1;
    std::cout << 20 * mem + 16 << std::endl;
}
页: [1]
查看完整版本: 小仙趣题分享-38