A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 firwood 于 2015-7-5 00:27 编辑

学编程,就要多多码代码。
找到个题挺有趣。
【题目】
N个人拍成一个圈,从某个人开始,逆时针从1开始数数。每个人得到自己的数字1N。在从1这个人开始,顺时针数数k个人,第k个人退出队列。从1开始,逆时针数m个人,第m个人退出队列(先数数,数好了,这两个人同时退出队列,如果第k人与第m人为同一个人,则只有这个人退出队列。)然后从刚才第k+1人顺时针数数,再次的第k人退出队列。从刚才的m+1人逆时针数数,第m人退出队列。(人员退出后不影响人的数字。)求退出队列的顺序。
输入
编写程序,将先后读(按顺序)三个数(NKMKM > 00n20)。每一组的三号将在一个单独的线和数据端将三个零表示(0 0 0)。
【输出】
输出退出队列的人的序号顺序。同时退出的人与下次退出的人之间用逗号隔开。
【示例】
10 4 3
0 0 0
【结果】
××4××8,××9××5,××3××1,××2××6,×10,××7

这里的×代表一个空格。
【解法】

通过循环模拟数数过程,将符合标准的人退出队列,并输出。
代码】
  1. import java.util.Scanner;
  2. public class Select {
  3.         public static int n = 0;
  4.         public static int k = 0;
  5.         public static int m = 0;
  6.        
  7.         public static int anti_clock_next(int begin, int delt, int[] a) {//计算逆时针对出队列人的方法
  8.                 while((delt--) != 0) {
  9.                         begin++;
  10.                         if(begin > n) {
  11.                                 begin = 1;
  12.                         }
  13.                         while(a[begin] == 0) {
  14.                                 begin++;
  15.                                 if(begin > n) {
  16.                                         begin = 1;
  17.                                 }
  18.                         }
  19.                 }
  20.                 return begin;
  21.         }
  22.        
  23.         public static int clock_next(int begin, int delt, int[] a) {//计算瞬时时针对出队列人的方法
  24.                 while((delt--) != 0) {
  25.                         begin--;
  26.                         if(begin < 1) {
  27.                                 begin = n;
  28.                         }
  29.                         while(a[begin] == 0) {
  30.                                 begin--;
  31.                                 if(begin < 1) {
  32.                                         begin = n;
  33.                                 }
  34.                         }
  35.                 }
  36.                 return begin;
  37.         }
  38.        
  39.         public static void main(String[] args) {
  40.                 Scanner scan = new Scanner(System.in);
  41.                 while(true) {
  42.                         //scanf
  43.                         try{
  44.                         n = scan.nextInt();
  45.                         k = scan.nextInt();
  46.                         m = scan.nextInt();
  47.                         }catch(Exception e){
  48.                                 break;
  49.                         }
  50.                         if(n == 0) break;
  51.                        
  52.                         int[] a = new int[n+1];
  53.                         int bm = 1;
  54.                         int bk = n;
  55.                         int left = n;
  56.                         int mget = 0;
  57.                         int kget = 0;
  58.                         for(int i = 1;i <= n;i++) {
  59.                                 a[i] = i;
  60.                         }
  61.                         while(left > 0) {
  62.                                 kget = anti_clock_next(bk,k,a);//计算逆时针退出队列的人
  63.                                 mget = clock_next(bm,m,a);//计算顺时针退出队列的人
  64.                                 a[kget] = 0;
  65.                                 a[mget] = 0;
  66.                                
  67.                                 bk = kget;
  68.                                 bm = mget;
  69.                                
  70.                                 if(kget == mget) {
  71.                                         left--;
  72.                                         System.out.printf("%3d",kget);
  73.                                 }else{
  74.                                         left-=2;
  75.                                         System.out.printf("%3d%3d",kget,mget);
  76.                                 }
  77.                                 if(left > 0) System.out.print(',');
  78.                         }
  79.                         System.out.println();
  80.                         scan.close();
  81.                 }
  82.         }
  83. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马