趣味编程之顺序排号

问题描述:

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

输入:人数n;

输出:最后留下的那一位的编号。

代码:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[n],i,num,k;
    for (i=0; i<n; ++i)
        a[i]=i+1;
    num=0;
    i=0;
    k=0;
    while (num<n-1)
    {
        if (a[i]!=0)
            k++;
        if (k==3)
        {
            a[i]=0;
            num++;
            k=0;
        }
        i++;
        if (i==n)
            i=0;
    }
    for (i=0; i<n; ++i)
        if (a[i]!=0)
            cout<<a[i];
    return 0;
}

运行结果:

这是校园oj平台上找到的题目,想了很久才理清楚思路(看来还得多加练习啊),后来上交代码时被坑了三次,结果都是编译错误,后来才发现oj平台提交的时候也是要选择编译器的、、、

时间: 2024-10-13 18:44:11

趣味编程之顺序排号的相关文章

ytu 1067: 顺序排号(约瑟夫环)

1067: 顺序排号Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 31  Solved: 16[Submit][Status][Web Board] Description 有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. Input 初始人数n Output 最后一人的初始编号 Sample Input 3 Sample Output 2 HINT Source freepro

10.5 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. #include <stdio.h> int main(){ int num[50]; int * p,n,i; p=num; printf("输入人的数目n="); scanf("%d",&n); //为每人赋初始的序号 for(i=0; i<n; i++){ *(p+i)=i+1; } int m=0,j=0,k=0;

java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 6 /*分析1====错误分析,没有注意到要退出圈子!!! 7 * 1.用一个数组存放n个1,从头开始报数 8 * 2.声明一个计数器,报数为3时,数组中的数赋为0,计数器重置 9 * 3.一直直到还剩下最后一个不为0的数,这个数的角标加1就是原来的几号 10 * 11 * 分析2:----利用A

5、题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 思路:n长度的数组,boolean类型。出圈置为false,当最后只有一个true的时候,就是留下来的人。

public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入人的个数n:"); int n = sc.nextInt(); fun(n); sc.close(); } private static void fun(int n) { boolean[] ps = new boolean[n]; int co

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

#include <iostream> using namespace std; int main() { int i,j,n,m,k,*p,num[100];k=m=0;   cin>>n;      p=num;      for(i=0;i<n;i++)          *(p+i)=i+1;      i=0;      while(m<n-1)      { if(*(p+i)!=0)            k++;         if(k==3)    

【转】约瑟夫环算法---------题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.

提示:用环形链表实现 对于这个题目其实就是用c语言的循环链表实现一个约瑟夫环.我们可以定义一个循环链表,将这n个人加入到链表中,然后定义三个节点指针在链表上循环,移动跨度为3,利用链表的循环功能每次删除第三个节点,这边要注意的一个问题就是你定义的是3个指针,且在循环中他们彼此也都是有 ->next关系,一般我们判断循环结束条件时都是一个节点的下一个节点是否为它本身(如ptr->next == ptr),这里我们要注意循环体中链接方向否则很可能出现无用指针导致错误,因为最后我们要剩下一个节点那么

有17个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下&#160;的是原来第几号的那位

int n = 17;  boolean[] persons = new boolean[n];  //初始化  for(int i=0;i<persons.length;i++){   persons[i] = true;  }    int len = persons.length;//剩下的人数  int count = 0;  while(len>1){   //继续报数   for(int i=0;i<persons.length;i++){    if(persons[i])

java有n个人围城一圈,顺序排号,从第一个开始报数(从一到三报数),凡报道三的人退出

import java.util.ArrayList;import java.util.List;import java.util.ListIterator;import java.util.Scanner; public class DequeueNumThree { //数组 public static void MethodArr(){ System.out.println("Please input total people : "); Scanner scanner = ne

经典趣味编程问题

相信很多人在笔试的时候会遇到类似的题目吧,问题是这样描述的: 有n个人围成一圈,顺序排号,从第一个人开始报数(从1~3报数),凡报到3的人退出圈子, 问最后留下的人原来排在第几号. 这个题目的思路其实不难,首先第一轮是需要被三整除,标记下报到3的那个人,然后在循环找下一个 报到3的个,记得找到的时候需要重新清下这个,从此人在往下找,依次找到,最后会留下那个没有被标记的数,就算找到了. 有点啰嗦,还是上代码吧 int FindLastNumber(int nums) { int i,isThree