有n个人围成一圈,顺序排号(从1到n)。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的人的标号是多少?
#include<stdio.h>
(737)#include<stdlib.h>
typedef struct LinkedNode{
int no;
struct LinkedNode* next;
}LinkedNode;
int main(){
int n,m=3;
while(scanf("%d",&n)!=EOF){
LinkedNode* a=(LinkedNode*)malloc(sizeof(LinkedNode)),* p;
a->no=1;
a->next=NULL;
p=a;
int i=2;
for(;i<=n;i++){
p->next=(LinkedNode*)malloc(sizeof(LinkedNode));
p=p->next;
p->no=i;
p->next=NULL;
}
if(i-1==n){
p->next=a;
}
LinkedNode *pre=p;
p=a;
for(int j=1;p!=(p->next);j++){
if(j%m==0){
pre->next=p->next;
p->next=NULL;
free(p);
p=pre->next;
}else{
pre=p;
p=p->next;
}
}
printf("%d\n",p->no);
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= m; i++) {
list.add(i);
}
int n = list.size();
int begin = 0;
while (n != 1) {
int index = (begin + 3) <= n ? begin + 2 : (begin + 3) % n == 0 ? (begin + 3) / n - 1: (begin + 3) % n - 1;
list.remove(index);
begin = index == n - 1 ? 0 : index;
n--;
}
System.out.println(list.get(0));
}
} #include<stdio.h>
#include<iostream>
using namespace std;
int main(void){
int n;
scanf("%d\n",&n);
int arr[n];//存储初始顺序
for(int i=0;i<n;i++){
arr[i]=i+1;
}
int nzero = n;//数组中非零个数
int j=1;
while(nzero>1){
for(int i=0;i<n;i++){
if(j==3 && arr[i]!=0){
arr[i]=0;//报数至三,arr[i]值为0
j=1;
nzero--;
}
if(arr[i]!=0 && j!=3){
j++;
}
}
}
for(int i=0;i<n;i++){
if(arr[i]!=0) printf("%d",i+1);
}
return 0;
}