zoukankan      html  css  js  c++  java
  • 台哥算法练习 50人围圈报数

    这是十年前写的代码了,虽然也能实现,但实现的方式就,低级了一点。

    假如我现在再做类似的题目,可能就会用面向对象的思想,完全模拟现实中的人的行为,虽然执行速度慢了,但理解起来更容易,代码会更优雅。

    package suanfa;
    
    
    /**
     * 50个人围圈报数问题
     * 
     * 问题:有50个人站成一个圈,第一个人开始数数(从1开始),每数到3或者3的倍数此人就退出,
     * 最后剩下的人是多少号?(编程实现)
     * 
     * @author 台哥编程课堂
     * https://blog.csdn.net/chaohi
     * 
     * 原理:对50个人的数组,不断循环遍历,遇到3的倍数就把该位置清零,
     * 直到清零个数为49个时,退出循环,程序结束。
     * 
     * ps:这是台哥十年前写的代码了,可读性上还是差了点,嘿嘿。
     * 
     */
    public class WeiquanBaoshu {
    
    	public static void main(String args[]) {
    		
    		// 定义数组并编号
    		int[] array = new int[50];
    		
    		for (int i = 0; i < array.length; i++) {
    			array[i] = i + 1;
    		}
    
    		// 当前数数人的编号
    		int id = 0;
    		// 当前要报的数字
    		int number = 1;
    		// 数组中值为0的项数
    		int count = 0;
    
    		for (;;) {
    			if (number % 3 == 0) {
    				array[id] = 0;
    				count++; 
    				
    				//当清零数目比数组大小只差一个的时候,程序完成
    				if (count >= array.length - 1) { 
    					break;
    				}
    			}
    			
    			number ++; //报数加1
    			
    			//下面这段逻辑,是查找遍历循环中,下一个还未清零的位置。遍历到数组尾部时,再从头部开始。
    			while (true) {
    				if (id < array.length - 1) {
    					id ++;
    				} else {
    					id = 0;
    				}
    				if (array[id] != 0)
    					break;
    			}
    		}
    
    		for (int i = 0; i < array.length; i++) {
    			if (array[i] != 0) {
    				System.out.println("最终留下的会是第" + array[i] + "个人");
    			}
    		}
    	}
    
    }
    
  • 相关阅读:
    套接字IO超时设置和使用select实现超时管理
    登录页面2
    tornado后台小框架
    form表单,登录用户,密码,按钮,提交、重置
    图标,空格,大小尖括号,段落,换行,标题,div白板,span白板
    html中head示例
    centos7中mysql不能输入中文问题的解决
    ORM多对多的实现
    多外键关联
    ORM外键关联
  • 原文地址:https://www.cnblogs.com/chaohi/p/10698001.html
Copyright © 2011-2022 走看看