算法训练 筛选号码



1145: 算法训练 筛选号码

时间限制: 1 Sec  内存限制: 512 MB
提交: 2  解决: 2
[提交][状态][讨论版]

题目描述

有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。
问最后留下的是原来第几号的那位。
举个例子,8个人围成一圈:
1 2 3 4 5 6 7 8
第1次报数之后,3退出,剩下:
1 2 4 5 6 7 8 (现在从4开始报数)
第2次报数之后,6退出,剩下:
1 2 4 5 7 8 (现在从7开始报数)
第3次报数之后,1退出,剩下:
2 4 5 7 8 (现在从2开始报数)
第4次报数之后,5退出,剩下:
2 4 7 8 (现在从7开始报数)
第5次报数之后,2退出,剩下:
4 7 8 (现在从4开始报数)
第6次报数之后,8退出,剩下:
4 7 (现在从4开始报数)
最后一次报数之后,4退出,剩下:
7.
所以,最后留下来的人编号是7。

输入

一个正整数n,(1<n<10000)

输出

一个正整数,最后留下来的那个人的编号。

样例输入

8

样例输出

7

提示


数据规模和约定



对于100%的数据,1<n<10000。

来源

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
	int n,a[10001]={0},sum=0,k,i;
	cin>>n;
	k=n;
	while(k!=1)
	{
		for(i=0;i<n;i++)
		{   
			if(a[i]==0)
			{ sum++;
				if(sum==3)
				{  
				   a[i]=1;
				   sum=0;
				   k=k-1;
				  // cout<<i+1<<endl;
			    }
			}
		}
	}
	for(i=0;i<n;i++)
	{
		if(a[i]==0)
		cout<<i+1<<endl;
	}
}


1145: 算法训练 筛选号码

时间限制: 1 Sec  内存限制: 512 MB
提交: 2  解决: 2
[提交][状态][讨论版]

题目描述

n个人围成一圈,顺序排号(编号为1n)。从第1个人开始报数(13报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。
问最后留下的是原来第几号的那位。
举个例子,8个人围成一圈:
1 2 3 4 5 6 7 8
1次报数之后,3退出,剩下:
1 2 4 5 6 7 8 (现在从4开始报数)
2次报数之后,6退出,剩下:
1 2 4 5 7 8 (现在从7开始报数)
3次报数之后,1退出,剩下:
2 4 5 7 8 (现在从2开始报数)
4次报数之后,5退出,剩下:
2 4 7 8 (现在从7开始报数)
5次报数之后,2退出,剩下:
4 7 8 (现在从4开始报数)
6次报数之后,8退出,剩下:
4 7 (现在从4开始报数)
最后一次报数之后,4退出,剩下:
7.
所以,最后留下来的人编号是7

输入

一个正整数n(1<n<10000)

输出

一个正整数,最后留下来的那个人的编号。

样例输入

8

样例输出

7

提示


数据规模和约定



对于100%的数据,1<n<10000

来源

posted @ 2017-02-11 17:57  X_na  阅读(161)  评论(0)    收藏  举报