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 count = ps.length; //判断是否是最后一个
//开始都有人,初始化为true
for (int i = 0; i < ps.length; i++) {
ps[i] = true;
}
//数到3剔除
for(int i = 0,j = 0;;i++){
if(ps[i]){
j++;
if(j == 3){
ps[i] = false;
j=0;
count --; //剔除一人少一人
}
}
//从开始继续循环
if(i == ps.length -1){
i = -1;
}
if(count == 1){
break; //最后一个人退出循环
}
}

//输出最后存在的那个人
for (int i = 0; i < ps.length; i++) {
if(ps[i]){
System.out.println("最后剩下的人的编号是:" + (i+1));
}
}
}
}

时间: 2024-07-30 10:19:17

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

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

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

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

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;

300个人围成一个圈,从某个指定的人开始报数(1--3),凡是数到3的人退出圈子

public static void main(String[] args) { /* * 300个人围成一个圈,从某个指定的人开始报数(1--3),凡是数到3的人退出圈子, * 问最后剩下的一个是从指定位置开始计数的第几个人? */ int num[]=new int[300]; int i=0; // 数组的下标计数器 0---299 int count=0; // 退出的人数计数器 0---299 int n=1; // 数数的计数器 1---3 while(count<299){ //

有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)    

有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])

用Matlab完成:从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

程序思路: (1)一圈人循环报数,报数报到3的人,将其置为0,表示被淘汰: (2)那么在接下去的循环中,被淘汰的人不参与报数: (3)直到仅有1人没被淘汰,并显示出他之前的编号. 程序实现如下: clear all n=input('Please input the number:') A=zeros(1,n) for i=1:n                                                         %对每个人进行顺序编号     A(i)=iend o

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个人开始报数(从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