C语言(33)小珂的游戏

 

描述

假设有2k个人围着一个圆桌坐着,前k个是好人,后k个是坏人 。现在开始,每m个人踢掉一个,比如有6个人,m=5,那么,被踢掉的人依次是5,4,6,2,3,1。现在要求,在踢掉第一个好人前,必需把所有的坏人踢掉,问,给定一个k,求满足这个要求的最小的m,现在希望你写一个程序,快速的帮助小珂,计算出来这个m。

 

输入

每行一个整数k(k<15),0表示输入结束.总测试数据的组数不多于200.

输出

各个组对应的最小的m,换行结束。

样例输入

3
4
0

样例输出

5
30
#include <stdio.h>
#include <stdlib.h>

int save[15]={0};

int func(int k)
{
	int m,n,x,y,flag,num;

	if(k == 1){
		save[0] = 2;
		return 2;
	}else if(k > 14){
		return -1;
	}

	for(m=k+1; m<100000000; m++){
		if((m%(2*k))<k && (m%(2*k) != 0)){
			continue;
		}

		n=0;
		flag=0;
		num=0;
		while(1){
			x = (m - num) % (2*k-flag);
			//printf("x=%d,m=%d,num=%d,flag=%d\n", x,m,num,flag);
			if(x > k || x == 0){
				n++;
			}else{
				break;
			}
			num = 2*k -flag - x;
			num %= (2*k-flag);
			flag++;

		}
		if(k <= n){
			break;
		}
	}

	save[k-1] = m;
	return m;
}


int main(int argc, char **argv)
{
	int i,k;
	for(i=1; i<15; i++){
		func(i);
	}
	while(scanf("%d", &k)){
		if(0 == k){
			break;
		}
		printf("%d\n",save[k-1]);
	}

	return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值