关于#c语言#的问题:聪明猪Tom及其家人和其他猪群居,他们面临凶恶屠户Thomas,Thomas有一个嗜好,他喜欢将群居的猪排成一行,首先将处于奇数位置的猪送到屠宰场

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

编号从1开始,运行结果:

img

代码:

#include <stdio.h>

int main()
{
    int m, n;
    int i, j;
    int ps[200]={0};
    int left, t;
    scanf("%d %d", &m, &n);
    for (i = 1; i <= m; i++)
        ps[i] = 1;
    left = m ;
    while (left > n)
    {
        t = 0;
        for (i = 1; i <= m; i++)
        {
            if (ps[i] == 1)
            {
                t++;
                if (t % 2 == 1)
                {
                    ps[i] = 0;
                    left--;
                    if (left == n)
                    {
                        for (j = 1; j <= m; j++)
                        {
                            if (ps[j] == 1)
                            {
                                printf("%d ", j);
                            }
                        }
                        return 0;
                    }
                }
            }
            
        }
    }
    for (j = 1; j <= m; j++)
    {
        if (ps[j] == 1)
        {
            printf("%d ", j);
        }
    }
    return 0;

}


 

最佳位置?就是最后被屠杀的n个位置呗?
定义一个数组,记录每次循环奇数位的位置,然后倒序输出n个位置

#include <stdio.h>
int main()
{
    int s[100]={0},n,m,b[100],j=0;
    scanf("%d%d",&m,&n);
    int count = 0;
    while(j<m)
    {
        count = 0;
        for(int i=0;i<m;i++)
        {
            if(s[i] == 0)
            {
                count++;
                if(count%2==1)
                {
                    b[j++] = i;
                    s[i] = 1;
                }
            }
        }
    }
    for(int i=m-1;i>=m-n;i--)
        printf("%d ",b[i]+1);
    return 0;
}