1385.石子消耗游戏


时间限制: 1000 MS          内存限制: 65536 K
        
提交数: 487 (0 users)          通过数: 283 (272 users)


问题描述
小明和小强在路上看到了一堆石子,数了数发现有N颗。无聊的他们决定玩一个游戏,由小明先取K颗石子,取完后换小强取,取2K颗,接着再换小明取,取3K颗,以此类推,他们轮流取,每次都比上一次多取K颗,问最后谁把石子取完(包括取的时候石子不够了),以及他们一共取了多少轮。请用函数嵌套来实现。


输入格式
输入只有一行,包括2个整数,N,K,如题目所述。(0<N,K<2^31)


输出格式
输出两行。
第一行若小明先取完,则输出”MING!”,否则输出”QIANG!”。(不包括引号)
第二行输出一个整数,代表取的轮次数。


样例输入
20 3


样例输出
QIANG!
4


来源

xmu

 

#include <stdio.h>

int main()
{
    int n, k;
    int pick_how_many;
    int turns;

    scanf("%d %d", &n, &k);
    turns = 0;
    pick_how_many = k;
    while (n > 0)
    {
        n -= pick_how_many;
        turns++;
        pick_how_many += k;
    }

    if (turns % 2 == 1)
        printf("MING!\n");
    else
        printf("QIANG!\n");
    printf("%d\n", turns);

    return 0;
}

若是用函数嵌套完成:

#include <stdio.h>

void MingPick(int left, int k, int turn);
void QiangPick(int left, int k, int turn);

void MingPick(int left, int k, int turn)
{
    if (left - turn * k <= 0)
        printf("MING!\n%d", turn);
    else
        QiangPick(left - turn * k, k, turn + 1);
}

void QiangPick(int left, int k, int turn)
{
    if (left - turn * k <= 0)
        printf("QIANG!\n%d", turn);
    else
        MingPick(left - turn * k, k, turn + 1);
}

int main()
{
    int n, k;
    scanf("%d%d", &n, &k);
    MingPick(n, k, 1);
    return 0;
}