经典趣味编程问题

相信很多人在笔试的时候会遇到类似的题目吧,问题是这样描述的:

有n个人围成一圈,顺序排号,从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,

问最后留下的人原来排在第几号。

这个题目的思路其实不难,首先第一轮是需要被三整除,标记下报到3的那个人,然后在循环找下一个

报到3的个,记得找到的时候需要重新清下这个,从此人在往下找,依次找到,最后会留下那个没有被标记的数,就算找到了。

有点啰嗦,还是上代码吧

int FindLastNumber(int nums)
{
	int i,isThree, total;
	int array[nums];
	int *pArray = array;
	
	for(i=0; i<nums; i++)
	{
		*(pArray+i) = i+1;//顺序标号 
	}
	i = 0;//循环变量 
	isThree = 0;//1,2,3计数变量 
	total = 0;//总数计数变量 
	while(total<nums-1)
	{
		if (*(pArray+i)!=0)
		{
			isThree++;//不为3,就继续往下找 
		}
		
		if(isThree == 3)
		{
			printf("out number is:%d\n", *(pArray+i));
			*(pArray+i) = 0;//标记下被点到的那个数 
			isThree = 0;//重新计数 
			total++;//计算下被标记的总数 
		}
		i++;//往后移动 
		if(i==nums)
		{
			i = 0;//报到尾部后,需要重新计数 
		}
	}
	while(*pArray == 0)
	{
		pArray++;//将最后剩下的那一个数找出来 
	}
	printf("the last number is:%d\n", *pArray);
	return *pArray;
}
以上为这个题目的基本算法,找出来的是最后剩下的那个,在给出测试程序来验证下:

int main(int argc, char **argv)
{
	int lastOne;
	int nums;
	
	while(1)
	{
		printf("Input the numbers of peoples:");
		scanf("%d", &nums);
		
		if(nums == 0)
		{
			printf("the wrong number!\n");
			return 0;
		}
		lastOne = FindLastNumber(nums);
		printf("out of queue number is:%d\n", lastOne);
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值