1 条题解
-
0
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; }
Pascal :
var n,m,i,s,k,t:longint; a:array[1..10000] of integer; begin readln(n,m); for i:=1 to n do a[i]:=1; while s<n-1 do begin repeat inc(k); if a[k]=1 then inc(t); if k>n then k:=0; until t=m; a[k]:=0; t:=0; inc(s); end; for i:=1 to n do if a[i]=1 then writeln(i); end.
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); } } } }
- 1
信息
- ID
- 390
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者