37 【程序 37 报数】

题目:有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 问最后留下的是原来第几号的那位。

package cskaoyan;

public class cskaoyan37 {
@org.junit.Test
public void countOff() {
java.util.Scanner in = new java.util.Scanner(System.in);
int[] num = new int[50];
int n, loop, i, m, k;
System.out.println("请输入这一圈人的数量:");
n = in.nextInt();
// 开始给这些人编号
for (i = 0; i < n; i++) {
num[i] = i + 1;
}
i = 0;// i用于计数,即让指针后移
m = 0;// m记录退出圈子的人数
k = 0;// k报数1,2,3
while (m < n - 1)// 当退出的人数不大于总人数时,即留下的人数至少是一个人
// 这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
// 这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
{
if (num[i] != 0)// 如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
{
k++;
}
if (k == 3) {
k = 0; // 报数清零,即下一个人从1开始报数
num[i] = 0;// 将报数为3的人编号重置为0
m++; // 退出人数加1
}
i++; // 指针后移
if (i == n)// 这句很关键,如果到了队尾,就要使指针重新指向对头
// 并且它只能放在i++后面,因为只有i++了才有可能i==n
{
i = 0;
}
}
System.out.print("现在剩下的人是:");
for (loop = 0; loop < n; loop++) {
if (num[loop] != 0) {
System.out.println(num[loop] + "号");
}
}
in.close();
}
}

最新文章

  1. Storm与Spark:谁才是我们的实时处理利器
  2. Super A^B mod C
  3. php中数据库的操作
  4. poj 2485 Highways 最小生成树
  5. MVC4.0 使用Form认证,自定义登录页面路径Account/Login
  6. Linux客户/服务器程序设计范式2&mdash;&mdash;并发服务器(进程池)
  7. html5 canvas防微博旋转
  8. A real ROCA using Bootstrap, jQuery, Thymeleaf, Spring HATEOAS and Spring MVC
  9. Swift2.0新特性
  10. python高级编程之装饰器04
  11. jQuery关于mouseover和mouseenter的区别
  12. (iOS)Storyboard/xib小技巧
  13. hololens Vuforia新时期的开发注意事项
  14. 【leetcode】482. License Key Formatting
  15. java-多线程(下)&amp;GUI
  16. WPF C# int.TryParse的用法
  17. shell设置连接服务器永不超时
  18. pytest.8.使用pytest做简单的接口测试
  19. github与本地电脑关联配置
  20. 解决ADB server didn&#39;t ACK问题

热门文章

  1. win10锁屏壁纸文件夹Assets中无文件问题的解决方法
  2. 0006SpringBoot中@Configuration与@Bean联合使用
  3. 转发:i p _ f o r w a r d函数
  4. windows版idea 2018.3.5版 永久激活教程
  5. Educational Codeforces Round 72 (Rated for Div. 2) A题
  6. Vue 中的 ref $refs
  7. netstat 基本用法
  8. DRF-视图类组件
  9. python输出的高亮显示
  10. 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)