设计算法 并用C语言描述 有没有大佬帮忙解答谢谢谢谢

设有n个人站成一排,从左向右的编号分别为1~n,现在从左往右报数“1,2,1,2……”,数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人... 设有n个人站成一排,从左向右的编号分别为1~n,现在从左往右报数“1,2,1,2……”,数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止。要求给出他们的出列顺序。 例如:n=8,初始序列:1,2,3,4,5,6,7,8      出队顺序为:1,3,5,7,2,6,4,8 展开
 我来答
总该有办法吧
2018-11-19 · TA获得超过227个赞
知道小有建树答主
回答量:222
采纳率:93%
帮助的人:147万
展开全部
#include <stdio.h>
void T1(int total,int out[]){
        int data[total*2+1];//最多只需要两倍的宽度即可
        int i,j;
        for(i=0;i<total*2;i++){
                if(i<total)             data[i]=i+1;
                else data[i]=-1;

        }
        int o=0;
        int last=total;//最后指针,指向队尾后面的空位
        //打印当前队列情况
        for(j=0;j<total*2;j++){
                if(data[j]!=-1)printf(" %d",data[j]);
        }
        printf("\n");
        //打印完毕
        int count=0;//序号
        for(i=0;i<total*2;i++){
                if(data[i]!=-1){//尚未出列
                        count++;//当前序号加一
                        if(count % 2 == 1){//叫到1
                                out[o]=data[i];//出列
                                o++;//出列指针加一
                                data[i]=-1;//当前位置设为空,不能再被叫到
                        }
                        else{//叫到2
                                data[last]=data[i];//移到最后
                                last++;//最后指针指向下一个空位置
                                data[i]=-1;//当前位置设为空,不能再被叫到
                                //打印当前队列情况
                                for(j=0;j<total*2;j++){
                                        if(data[j]!=-1)printf(" %d",data[j]);
                                }
                                printf("\n");
                                //打印完毕
                        }
                }
        }
}
main(int argc,char * argv[]){
        int total=10;
        int i;
        if(argc>1){
                total=atoi(argv[1]);
        }
        int out[total];
        T1(total,out);
        //打印出列顺序
        printf("出列顺序:");
        for(i=0;i<total;i++){
                if(i>0)printf(",");
                printf("%d",out[i]);
        }
        printf("\n");
}

输出结果如下架设13个人的队列
 1 2 3 4 5 6 7 8 9 10 11 12 13
 3 4 5 6 7 8 9 10 11 12 13 2
 5 6 7 8 9 10 11 12 13 2 4
 7 8 9 10 11 12 13 2 4 6
 9 10 11 12 13 2 4 6 8
 11 12 13 2 4 6 8 10
 13 2 4 6 8 10 12
 4 6 8 10 12 2
 8 10 12 2 6
 12 2 6 10
 6 10 2
 2 10
 10
出列顺序:1,3,5,7,9,11,13,4,8,12,6,2,10
帐号已注销
2018-11-19 · 超过16用户采纳过TA的回答
知道答主
回答量:110
采纳率:30%
帮助的人:25.5万
展开全部
题目呢?
具体要求啥?
更多追问追答
追问
设有n个人站成一排,从左向右的编号分别为1~n,现在从左往右报数“1,2,1,2……”,数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止。要求给出他们的出列顺序。 例如:n=8,初始序列:1,2,3,4,5,6,7,8      出队顺序为:1,3,5,7,2,6,4,8
追答
需要输出么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式