人类高质量代码解约瑟夫环问题

n个人(0,1,2,3,4…n-1),围成一圈,从编号为k的人开始报数,报数报到m的人出队(报数是1,2,…m这样报的)。下次从出队的人之后开始重新报数,循环往复,当队伍中只剩最后一个人的时候,那个人就是大王。现在,给定n,k,m, 请你求出大王的编号。

输入一行包含三个整数
n,k,m1<=n<=100,1<=k<=n-1,1<=m<=100

代码描述

#include <stdio.h>
#include <stdlib.h>
int main() {
    
    
	int array[100]={
    
    0};
	int n=0;
	int k=0;
	int m=0;
	scanf("%d%d%d",&n,&k,&m);
	int i=0;
	for(i=0;i<n;i++){
    
    	//确定玩的人数,给赋值为1 
		array[i]=1;
	}
	int index=1; 		//报的序号 
	i = k-1;			//根据数据特性,确定好编号从为k的人开始数 
	int pen = n;		//记录剩余人数,剩下一个的时候就是国王 
	while(pen !=1 ) {
    
    
		if(i>=n){
    
    
			i=0;		//人数报完了就重置
		}
		if(array[i]==0){
    
    
			i++;
			continue;	//没有人了,就不能继续报数了,直接跳过即可
		}
		if(index == m){
    
     //设置淘汰后的情况
			array[i] = 0;
			index = 0;
			pen--;
		}
		i++;
		index++; 
	}
	for(i=0;i<n;i++){
    
    
		if(array[i]==1){
    
    
			printf("%d",i+1);
			break;
		}
	}
	return 0;
}

结果检测:

输入
5 1 2
输出
3

猜你喜欢

转载自blog.csdn.net/m0_46672781/article/details/121229690