约瑟夫环(简单版)

约瑟夫环(简单版)

传说约瑟夫当年活下来就是靠快速计算这个问题。

n 个人围成一圈,编号依次为 1,2,3…n。从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1开始报数,数到 m 的人再出圈。以此类推,直到所有的人都出列。请输出依次出圈人的编号。

输入格式
两个整数 n,m,1≤n,m≤100。

输出格式
n个用空格分隔的整数,表示出圈人的编号。

输入

6 4

输出

4 2 1 3 6 5

思路

根据题中所给条件,n>=1,m<=100可得可利用数组进行计算,因为需输出出圈人的序号故用while循环和for循环,并利用判断语句进行判断并输出。

#include<stdio.h>
int main(){
	int n,m,a[100]={0},b=0,c=0,i=0;  //定义变量
	scanf("%d%d",&n,&m);  //输入人数以及出圈数
	while(b!=n){  //利用while输出对应的序号
		i++;
		if(i>n){   //当所有人都报完数后重新从1开始
			i=1;
		} 
		if(a[i]==0){  //利用判断语句进行判断该数字是否符合条件
			c++;
			if(c==m){  //报数到m时归零
			c=0;
				a[i]=1; //将相应位置上占据
				b++;
				if(b==n){
					printf("%d",i);
				}
				else{
					printf("%d ",i);  //输出时中间有空格
				}
			}
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值