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

大一c语言编程问题,求大神解答。。。。。。谢谢有n个人围成一圈,顺序排号,从第一个人开始(从1-3报数),,报到三的人退出圈子,求退出顺序... 大一c语言编程问题,求大神解答。。。。。。谢谢
有n个人围成一圈,顺序排号,从第一个人开始(从1-3报数),,报到三的人退出圈子,求退出顺序
展开
 我来答
wm45904978
2014-11-28 · TA获得超过132个赞
知道答主
回答量:52
采纳率:0%
帮助的人:61.4万
展开全部
#include <stdio.h>

#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
更多追问追答
追问
看不懂X o X(︶.︶)
追答
我的注释太少了?
水上漂汤
2014-11-28 · TA获得超过1万个赞
知道大有可为答主
回答量:1830
采纳率:71%
帮助的人:1429万
展开全部
我的想法是建立一个数组,下标就是人的编号,每遍历3个人,就把当前的元素值设置为0
下次报数忽略元素值为0的元素。i表示真实的数组下标,j表示第j个数
#include <stdio.h>
#include <stdlib.h>

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;
}
追问
我刚学,有些符号看不懂
追答
比如?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
熊猫级教父
2014-11-28 · 超过34用户采纳过TA的回答
知道答主
回答量:88
采纳率:0%
帮助的人:49.4万
展开全部
:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来第几号的那位。(要求用指针链表实现)

#include<stdio.h>
#include<stdlib.h>
#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<n;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<n;)
{
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;
}
追问
X o X原谅我看不懂你写的
追答
....
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1347a34
2016-04-23 · TA获得超过2558个赞
知道小有建树答主
回答量:497
采纳率:66%
帮助的人:366万
展开全部
#include<iostream>
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<n+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<<"留下来的人序号为: "<<x<<"\n";
    delete [] a;
    cin.get();
    cin.get();//等待下一次键击关闭窗口
    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3212b2c
2014-11-28 · 超过74用户采纳过TA的回答
知道小有建树答主
回答量:518
采纳率:0%
帮助的人:153万
展开全部
请认真写作业。
更多追问追答
追问
我也想认真写,这个不会写啊
追答
这是一道数学题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式