大一c语言编程问题,求大神解答。。。。。。谢谢 有n个人围成一圈,顺序排号,从第一个人开始(从1-

2024-11-25 10:37:53
推荐回答(5个)
回答1:

#include

#define N 10

void main()
{
char student[N];//N个人,1表示未退出,0表示已经退出
int out[N];//退出的人的号码记录
int count = -1;//循环计数 0,1,2 <=> 1-3
int num_out = -1;//退出号码记录的数组的下标
memset(student, 1, sizeof(student));//将所有人状态置为1(未退出)
for (int i = 0; i < N && num_out < N - 1; i = ++i % N)
{
if (1 == student[i] && 2 == ++count%3)
{
//未退出的人计数到2的人标记退出,并将号码保存到out数组中
student[i] = 0;
out[++num_out] = i;
}
}

//循环输出退出的号码
for (int i = 0; i < N; ++i)
{
printf("%d\t", out[i]+1);
}
}

PS:刚写的,简单验证过:OK

回答2:

我的想法是建立一个数组,下标就是人的编号,每遍历3个人,就把当前的元素值设置为0
下次报数忽略元素值为0的元素。i表示真实的数组下标,j表示第j个数
#include 
#include 

int main()
{
    int n, i, j, count = 0;
    scanf("%d", &n);
    int *no = (int*)malloc((n + 1)*sizeof(int));
    for (i = 1; i <= n; ++i)
        no[i] = i;

    while (n - count >= 3)
    {
        for (i = 1, j = 1; i <= n; ++i)
        {
            if (no[i] == 0)
                continue;
            if (j%3 == 0)
            {
                printf("%d ", no[i]);
                no[i] = 0;
                ++count;
            }
            ++j;
        }
        printf("\n");
    }
    return 0;
}

回答3:

:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来第几号的那位。(要求用指针链表实现)

#include
#include
#define N sizeof(struct student)
int main()
{
struct student
{
int a;
int b;
struct student *next;
};
struct student *p,*q,a;
int n,b=0,i;
printf("请输入n:");
scanf("%d",&n);
p=q=(struct student *)malloc(N);
a.next=p;
for(i=0;i{
q=(struct student *)malloc(N);
p->a=i+1;
p->b=1;
p->next=q;
p=p->next;

}
p->next=a.next;
p=a.next;
for(i=1;i{
if(p->b==1)
{
b++;
if(b==3)
{b=0;p->b=0;i++;}
}
p=p->next;
}
printf("最后出来的是第:");
p=a.next;
for(i=1;i<=n;i++)
{
if(p->b==1)
printf("%d个人\n",p->a);
p=p->next;
}
return 0;
}

回答4:

#include
using std::cin;
using std::cout;
int main()
{
    int n;
    cout<<"请输入n= ";
    cin>>n;
    if(n<2)
    {
    cout<<"n必须大于2!\n请重新输入n= ";
    cin>>n;
    }
    bool * a = new bool [n+1];
    a[0]=false;
    for(int i=1;i    a[i]=true;
    int x,k=n;x=i=0;//i为每次循环计数变量,x为人员序号,K为剩余人数
    while(k!=0)
    {
    x++;
    if(x>n) x=1;//当人员到达数组尾,序号重设为1
    if(a[x])i++; // 跳过已退出人员
    if(i==3)
    {a[x]=false;i=0;k--;}//当数到3时,退出人员设为false,剩余人数减1,i设为0,重新计数
    }
    cout<<"留下来的人序号为: "<    delete [] a;
    cin.get();
    cin.get();//等待下一次键击关闭窗口
    return 0;
}

回答5:

请认真写作业。