• 小孩报数问题3750


    有N个小孩围成一圈。给他们从1開始依次编号。现指定从第W个開始报数。报到第S个时。该小孩出列,然后从下一个小孩開始报数,仍是报到S个出列,如此反复下去,直到全部的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。


    //方法一双向循环链表
    
    #include<iostream>
    #include<cstring>
    #include<stdio.h>
    
    using namespace std;
    
    struct List//双向链表结构体
    {
    	char name[20];
    	struct List *front;    //前指针
    	struct List *rear;    //后指针
    };
    
    List* create(int n)
    {
    	List *node,*head;                 //定义头结点和尾结点
    	head = node = new List;
    	for(int i = 2;i <=n ;i++)
    	{
    		node->rear = new List;         //初始化后指针
    		node->rear->front = node;      //双向指向
    		node = node->rear;
    	}
    	node->rear = head;
    	head->front = node;
    	return head;
    }
    
    
    List* move(List* p,int step)           //链表计数移动
    {
    	for(int i = 1;i < step ; i++)
    	{
    		p = p->rear;
    	}
    	return p;
    }
    
    List* remove(List* p)                   //删除结点操作
    {
    	p->front->rear = p->rear;
    	p->rear->front = p->front;
    	p = p->rear;                        //删除结点三步走
    	return p;
    }
    
    int main()
    {
    	int n,w,s;
    	scanf("%d",&n);
    	List *node,*head;
    	head = node =create(n);
    	for(int i =1;i <= n;i++)
    	{
    		scanf("%s",node->name);
    		node = node->rear;
    	}
    	scanf("%d%d",&w,&s);
    	node = move(head,w);
    	while(node->rear != node)        //循环遍历终止条件
    	{
    		node = move(node,s);
    		printf("%s
    ",node->name);
    		node = remove(node);
    	}
    	printf("%s
    ",node->name);  //最后一个结点要输出
    	system("pause");
    }
    



    //方法二单向链表
    
    #include<stdio.h>
    #include<iostream>
    using namespace std;
    struct ch
    {
    	char name[100];
    	struct ch *next;
    };
    
    int main()
    {
    	int N=0,i=0,w=0,s=0,j=0;
    	struct ch *p = NULL,*head = NULL,*NEW = NULL,*q = NULL;
    	scanf("%d",&N);
    	for(i=0;i<N;i++)
    	{
    		NEW = new ch();
    		scanf("%s",NEW->name);
    
    		if(p==NULL)
    		{
    			head = NEW;
    			p = NEW;
    		}
    		else
    		{
    			p->next = NEW;
    			p = NEW;
    		}
    	}
    	p->next = head;
    	scanf("%d%d",&w,&s);
    	p = head;
    	for(i=1;i<w;i++)
    	{
    		p = p->next;
    	}
    	q = p;
    
    	for(i=0;i<N;i++)
    	{
    		for(j=1;j<s;j++)          //循环一次出去一个人少一个人
    		{
    			q = p;
    			p = p->next;
    		}
    		printf("%s
    ",p->name);
    		q->next = p->next;
    		p = q->next;
    	}
    	system("pause");
    }






  • 相关阅读:
    Web 学习笔记
    Canvas 实现灵动的红鲤鱼动画(上)
    Canvas 仿百度贴吧客户端 loading 小球
    使用 Vue 和 epub.js 制作电子书阅读器
    用 Vue 开发一个简单的答题应用(一)
    利用 html2canvas 做个简单的诗词卡片生成器
    FileSaver.js 介绍
    shim 和 polyfill
    clipboard.js 介绍
    (译)通过 HTML、JS 和 Electron 创建你的第一个桌面应用
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7360354.html
Copyright © 2020-2023  润新知