2646 - 拉手游戏
时间限制 : 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); } } } }