【每日编程-433期】西安交通大学上机题(五)

教育   2025-01-31 10:02   江西  

西安交通大学上机题(五)


每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399



n个小朋友轮流数数,每次+1,mod k为零时该名小朋友失败,问最后谁赢?

输入格式:

输入小朋友的个数n和被除数k。

输出格式:

输出最后一名出局的小朋友的序号。

输入样例:

5
2

输出样例:

3

解决方法:

(1)算法的基本思想:

建立两个数组,先将所有小朋友的序号存入第一个数组,第一轮数完之后,将剩下的序号放入第二个数组,开始第二轮,第二轮结束后将剩下的序号放入第一组,依次循环,直至剩下最后一名小朋友。

(2)代码实现:

#include <stdio.h>
int main()
{
    printf("请输入人数:\n");
    int n;
    scanf("%d", &n);
    printf("请输入被除数:\n");
    int k;
    scanf("%d", &k);
    printf("\n");
    int a[n], b[n];
    int i = 0, j = 0, flag = 0, shengyu = n, yushu = 0, s = 0;
    for (i = 0; i < n; ++i)
    {
        a[i] = i + 1;
    }
    while (shengyu > 0)
    {
        i = 0;
        j = 0;
        s = 0;
        if (flag == 0)
        {
            while (i < shengyu)
            {
                if ((yushu + 1 + i) % k != 0)
                {
                    b[j] = a[i];
                    ++j;
                }
                else
                {
                    printf("%d\n", a[i]);
                    s = s + 1;
                }
                ++i;
            }
            yushu = shengyu % k + yushu;
            shengyu = shengyu - s;
            flag = 1;
        }
        else if (flag == 1)
        {
            while (i < shengyu)
            {
                if ((yushu + 1 + i) % k != 0)
                {
                    a[j] = b[i];
                    ++j;
                }
                else
                {
                    printf("%d\n", b[i]);
                    s = s + 1;
                }
                ++i;
            }
            yushu = shengyu % k + yushu;
            shengyu = shengyu - s;
            flag = 0;
        }
    }
    printf("\n最后一个小朋友是:%d", b[i - 1]);

    return 0;
}

明日预告:西北农林科技大学上机题(一)

将一个长度为10的数列最大值放第一个,最小值放最后一个。

输入样例:

1 2 3 4 5 9 0 7 8 6

输出样例:

9 2 3 4 5 1 6 7 8 0


灰灰考研
最全的【计算机考研】【软件考研】考研信息! 最丰富的共享资料! 最大程度上帮助学渣狗登上研究生大门!
 最新文章