本帖最后由 firwood 于 2015-7-5 00:27 编辑
学编程,就要多多码代码。 找到个题挺有趣。 【题目】 N个人拍成一个圈,从某个人开始,逆时针从1开始数数。每个人得到自己的数字1到N。在从1这个人开始,顺时针数数k个人,第k个人退出队列。从1开始,逆时针数m个人,第m个人退出队列(先数数,数好了,这两个人同时退出队列,如果第k人与第m人为同一个人,则只有这个人退出队列。)然后从刚才第k+1人顺时针数数,再次的第k人退出队列。从刚才的m+1人逆时针数数,第m人退出队列。(人员退出后不影响人的数字。)求退出队列的顺序。 【输入】 编写程序,将先后读(按顺序)三个数(N,K和M;K,M > 0,0<n<20)。每一组的三号将在一个单独的线和数据端将三个零表示(0 0 0)。 【输出】 输出退出队列的人的序号顺序。同时退出的人与下次退出的人之间用逗号隔开。 【示例】 10 4 3 0 0 0 【结果】 ××4××8,××9××5,××3××1,××2××6,×10,××7
这里的×代表一个空格。 【解法】
通过循环模拟数数过程,将符合标准的人退出队列,并输出。 【代码】 - import java.util.Scanner;
- public class Select {
- public static int n = 0;
- public static int k = 0;
- public static int m = 0;
-
- public static int anti_clock_next(int begin, int delt, int[] a) {//计算逆时针对出队列人的方法
- while((delt--) != 0) {
- begin++;
- if(begin > n) {
- begin = 1;
- }
- while(a[begin] == 0) {
- begin++;
- if(begin > n) {
- begin = 1;
- }
- }
- }
- return begin;
- }
-
- public static int clock_next(int begin, int delt, int[] a) {//计算瞬时时针对出队列人的方法
- while((delt--) != 0) {
- begin--;
- if(begin < 1) {
- begin = n;
- }
- while(a[begin] == 0) {
- begin--;
- if(begin < 1) {
- begin = n;
- }
- }
- }
- return begin;
- }
-
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- while(true) {
- //scanf
- try{
- n = scan.nextInt();
- k = scan.nextInt();
- m = scan.nextInt();
- }catch(Exception e){
- break;
- }
- if(n == 0) break;
-
- int[] a = new int[n+1];
- int bm = 1;
- int bk = n;
- int left = n;
- int mget = 0;
- int kget = 0;
- for(int i = 1;i <= n;i++) {
- a[i] = i;
- }
- while(left > 0) {
- kget = anti_clock_next(bk,k,a);//计算逆时针退出队列的人
- mget = clock_next(bm,m,a);//计算顺时针退出队列的人
- a[kget] = 0;
- a[mget] = 0;
-
- bk = kget;
- bm = mget;
-
- if(kget == mget) {
- left--;
- System.out.printf("%3d",kget);
- }else{
- left-=2;
- System.out.printf("%3d%3d",kget,mget);
- }
- if(left > 0) System.out.print(',');
- }
- System.out.println();
- scan.close();
- }
- }
- }
复制代码
|