围圈报数 c

#include<stdio.h>

/*围圈报数*/
void left(int *p,int m,int n)
{
    int i,j,count;
    i = j = count = 0;
    while(count < m-1)
    {
        if(*(p+i) != 0)
            j++;
        if(j == n)
        {
            *(p+i) = 0;
            count++;
            j = 0;
        }
        if(++i == m)
            i = 0;
    }
}

int main(void)
{
  int x,y;
  scanf("%d%d",&x,&y);
  int arr[x];
  int i;
  for(i=0; i<x; i++)
     arr[i] = i+1;
  left(arr,x,y);
  for(i=0; i<x; i++)
      if(arr[i] != 0)
          printf("%d\n",arr[i]);
 return 0;
}
时间: 2024-10-10 01:56:08

围圈报数 c的相关文章

使用循环链表实现约瑟夫环(围圈报数问题)

刚开始学C,碰到经典的围圈报数问题,现先将实现代码附下: #include<stdio.h>#include<stdlib.h> struct LNODE{ //链表定义 int data; struct LNODE *next;};typedef struct LNODE Lnode;typedef struct LNODE *LinkList;struct LNODE *create(int s[]) //创建单项循环链表{ struct LNODE *head=NULL,*p

【例2-3】围圈报数

[例2-3]围圈报数 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1334时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,-,如此反复到所有的人全部出列为止.设n个人的编号分别为1,2,-,n,打印出列的顺序. [输入] n和m. [输出] 出列的顺序. [输入样例] 4 17 [输出样例]

1334:【例2-3】围圈报数

1334:[例2-3]围圈报数 时间限制: 1000 ms         内存限制: 65536 KB提交数: 2253     通过数: 1482 [题目描述] 有nn个人依次围成一圈,从第11个人开始报数,数到第mm个人出列,然后从出列的下一个人开始报数,数到第mm个人又出列,…,如此反复到所有的人全部出列为止.设nn个人的编号分别为1,2,…,n1,2,…,n,打印出列的顺序. [输入] nn和mm. [输出] 出列的顺序. [输入样例] 4 17 [输出样例] 1 3 4 2 [提示]

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

围圈报数

通过进栈出栈实现循环 #include<iostream> #include<queue> using namespace std; queue<int> q; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) q.push(i); int num=1; while(!q.empty()){ if(num==m){ cout<<q.front()<<"

C语言——N个人围成一圈报数淘汰问题

<一>问题描述: 有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止. 问此人原来的位置是多少号? <二>问题解决: 1.定义数组记录每个编号的状态(是否被淘汰): 2.在未被淘汰的人中检查是否数到3,若是,淘汰此人: 3.继续此过程至所有人被淘汰: <三>示例代码: 1 /* 2 16.有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 3 凡报到 3的倍数的人离

【C】n个人排成一圈报数的问题

问题来自:<C程序设计>(第四版)谭浩强 清华大学出版社 第291页 有n个人围城一圈,顺序排号.从第一个人开始报数(从1报到m),凡是报到m的人退出圈子,接着从循环队列的下一位开始报数(该数为1).问最后留下的是原来几号的那位. 注:本例为模拟题,按要求写程序即可. 示例代码: 1 #include <stdio.h> 2 3 int a[100]; 4 5 int find(int *a, int n, int m) 6 { 7 int counter = n; 8 int i

约瑟夫环问题(100围坐一圈报数,报3出圈)

100个人编号1-100,围坐一圈,从1号开始进行1,2,3报数,谁报数为3,就离开圈子,剩下的人继续报1,2,3,报数为3的出圈... 请写一段程序,计算最后一个留下来的人,他的编号 1 package com.ycl.test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Test1 { 7 public static void main(String[] args) { 8 int co

100灯泡围圈通亮问题

问题描述 有一百个灯泡,围成一个圈.每个灯泡有一个开关.如果一个灯被打开或者关闭,那么它相邻的两个灯泡状态会与原状态相反(亮变暗,暗变亮).请问是否存在一种操作方式可以把这一百个灯泡打开(都处于亮的状态). 分析 1.将一百个等编号[1-100],设置亮为1,暗为0,初始都为02.从1号灯泡开始打开,每次隔着前一次按下编号的两个灯按,N=3n-2 (n表示第n次打开灯泡),这样一直按下去,直到只有99号灯不亮 为止,一共需要按33次.3.这个时候唯一可以操作的就是把99号灯打开,那么98,100