2646 - 拉手游戏

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

N个小朋友手拉手站成一个圆圈,从第一个小朋友开始循环报数,报到M的那个小朋友退到圈外,然后他的下一位重新报"1"。这样继续下去,直到最后只剩下一个小朋友,他原来站在什么位置上呢?

题目输入

仅一行,有两个数N和M,其中N表示小朋友的人数,M表示报到数。1<N<1000,M<=N

题目输出

仅一个数,留下的小朋友的编号。

输入/输出样例

输入格式

8 3

输出格式

7

C++解答

#include<bits/stdc++.h>
using namespace std;
int main()
{
	
	int n,m,a[1005];
	cin>>n>>m;
	int ans=0,sum=0;
	for(int i=1;i<=n;i++)
		a[i]=i;
	for(int i=1;   ;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[j]!=0)
			{
				ans++;
				if(ans==m)
				{
				a[j]=0;sum++;
				ans=0;
				}
			}
			if(sum==(n-1))
			{
				for(int k=1;k<=n;k++)
				{
					if(a[k]!=0)
					{cout<<k; return 0;}
				}
			
			}
	
			
		}
	}
	
	
	
	
	return 0;
}

Java解答

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
          Scanner s = new Scanner(System.in);
          int n = s.nextInt();
          int m=s.nextInt();
          boolean[] arr = new boolean[n];
          for(int i=0; i<arr.length; i++) {
           arr[i] = true;//下标为TRUE时说明还在圈里
          }
          int leftCount = n;
          int countNum = 0;
          int index = 0;
          while(leftCount > 1) {
           if(arr[index] == true) {//当在圈里时
            countNum ++; //报数递加
            if(countNum == m) {//报道3时
             countNum =0;//从零开始继续报数
             arr[index] = false;//此人退出圈子
             leftCount --;//剩余人数减一
            }
           }
           index ++;//每报一次数,下标加一
           if(index == n) {//是循环数数,当下标大于n时,说明已经数了一圈,
            index = 0;//将下标设为零重新开始。
           }
          }
          for(int i=0; i<n; i++) {
           if(arr[i] == true) {
            System.out.println(i+1);
           }
          }
     }
}