c语言(数组,循环,)

聪明猪Tom及其家人和其他猪群居,他们面临凶恶屠户Thomas,Thomas有一个嗜好,他喜欢将群居的猪排成一行,首先将处于奇数位置的猪送到屠宰场,剩下的猪自然成为新的一行。
在新的一行中,再次将处于单数位置的猪送到屠宰场,如此重复多次。
从键盘上输入所有猪的个数m(假设m不超过100),Tom及家人的个数n,求解Tom及家人应该站的最佳位置,输出这些位置。

个人理解,仅供参考!谢谢!

img

img

img

#include <stdio.h>

//提取有效数字个数
int getn(int *arr, int n)
{
    int k = 0;
    for (int i = 0; i < n; i++)
    {
        if (arr[i] != -1)
        {
            k++;
        }
    }
    return k;
}

int main(int argc, char *argv[])
{
    int m, n;
    do
    {
        scanf("%d%d", &m, &n);

    } while (m > 100 || m < 0 || n < 0 || n > m);

    int arrm[m];

    //初始化
    for (int i = 0; i < m; i++)
        arrm[i] = i + 1;

    //设置
    int z = 0, k = 0; //k奇数计数器
    for (int i = 0; i < m; i++)
    {
        //设置一个剔除位值为-1
        if (arrm[i] != -1)
        {
            k++;
            if (k % 2 != 0)
                arrm[i] = -1;
        }

        //提取有效位个数
        z = getn(arrm, m);

        //如果有效位个数等于小猪家人数跳出循环
        if (z == n)
            break;

        //保证回圈循环
        if (i == m - 1)
        {
            k = 0;
            i = -1;
        }
    }

    puts("\n小猪家人最好的位置:");
    for (int i = 0; i < m; i++)
    {
        if (arrm[i] != -1)
            printf("第%d位\n", arrm[i]);
    }

    return 0;
}