package com.itheima.test;
/*
* 10、 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。
* 问:最后剩下的是100人中的第几个人?
*
*
*遇到难题:开始没读明白题目,以为最后会剩下13个人,读不到14,其实这道题意思是围成一个圈
*就算最后只有俩个人,互相报数直到谁念到14即淘汰,所以这里要淘汰99个人。
*思路:1定义一个数组,数组的的值和下标是相等的对应1-100人
* 2只要谁报数到14 就让对应数组的值归为0,用j记录,并且用count记录淘汰人数
* 3当淘汰人数到达99时 跳出循环
* 4当数组角标到达100时,将角标重新归置为0,这样可实现多次循环,直到淘汰人数达到99,才结束循环
* 这是我最初的想法 ,暂时未想到最优解,代码虽端,但99次的for循环1-100 时间着实浪费,等有时间我会参考改进
* 这道题的算法,
*
*
* */
public class test10
{
public static void main(String[] args)
{
//淘汰人数
int count = 0;
//报数 号
int j = 0;
int[] a = new int[101];
//给数组赋值角标对应着数组值
for(int i = 0; i < 101; i++)
a[i] = i;
for(int i = 1; i < 101; i++)
{
//选出数组值不为0的数,
if(a[i] != 0)
{
//报数号增加
j++;
if(j == 14)//当报数号增加到14时
{
count++;//淘汰人数增加
a[i] = 0;//淘汰人对应的数组值置零,不在参与if判断
j = 0;//重新开始报号
}
}
if(i == 100)//当数组到100 时置零,重新开始循环
i = 0;
//当淘汰人数为99时 退出整个循环
if(count == 99)
break;
}
//遍历数组,找出数组中不为零的数即为剩下的最后一个人
for(int i = 1 ; i < 101; i++)
{
if(a[i] != 0)
System.out.println("剩下的最后一个人为 :" + a[i]);
}
}
} |