黑马程序员技术交流社区
标题:
关于算法的一题
[打印本页]
作者:
提菩--空
时间:
2014-5-9 17:28
标题:
关于算法的一题
本帖最后由 提菩--空 于 2014-5-12 17:59 编辑
一排小孩数三,数到三的退出,最后一个小孩报数后,第一个小孩接着报,相当于一个循环。问最后一个孩子是这排孩子的第几位。我写不出来,那位能给个思路。
作者:
走在道上发着呆
时间:
2014-5-9 19:21
去查约瑟夫环
作者:
谢振宣
时间:
2014-5-9 20:04
//用了一个很笨的方法,水平有限,还在学基础。
import java.util.Scanner;
class Demo
{
static int renShu;
static int weiZhi;
static int geiZeShu;
public static void main(String[] args)
{
System.out.print("请输入参加游戏的人数:");
Scanner in = new Scanner(System.in);
renShu = in.nextInt();
int[] arr = new int[renShu];
geiZeShu = 3;//此处的规则数可以重新设定
weiZhi = search(arr,geiZeShu);
System.out.println("剩下的是第"+weiZhi+"个小朋友。");
}
public static int search(int[] arr,int x)//循环数数,直至最后一个小朋友
{
x = geiZeShu;
int m = 0;
int n = 0;
for (int i = 0;i<arr.length;i++)//确定所有人的位置
{
arr[i] = 1;
}
for (int i = 0;i<=arr.length;i++)
{
if (i==arr.length)//尾部接上头部,继续循环
{
if (n==1)//只剩一个人时,游戏结束
{
return searchIndex(arr,1);
}
i = 0;
n = 0;
}
if (arr[i]==1)//剩余的小朋友继续数数
{
m++;
n++;
}
if (m==x)//数到规则数的人退出,再重新开始数
{
m = 0;
arr[i] = x;
}
}
return -1;
}
public static int searchIndex(int[] arr,int j)//找出剩下的最后一个小朋友的位置
{
for (int i = 0;i<arr.length;i++)
{
if (arr[i]==j)
return i+1;
}
return -1;
}
}
复制代码
作者:
余琪琪
时间:
2014-5-9 21:27
这个是五一搞活动的题目啊,网上搜索下,很多相关的
作者:
李彦来
时间:
2014-5-9 22:13
可以拿循环链表做
作者:
周大侠
时间:
2014-5-9 23:30
这个简单啊,
作者:
姜蕾蕾
时间:
2014-5-9 23:46
import java.util.Arrays;
import java.util.Scanner;
class Demo_SitNum
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
System.out.println("请输入总人数:");
int i = input.nextInt();//输入的总人数;
/****************** 初始化人员 ************************/
boolean[] persons = new boolean[i];
for(int m=0;m<persons.length;m++) //赋值数组所有元素为true;
{
persons[m] = true;
}
System.out.println("※※※※※※※※※※※※※ *或得的结果为* ※※※※※※※※※※※※\n");
System.out.print("开始的数组情况为:");
for(boolean person:persons)//foreach遍历数组元素,注:foreach只能取值不能赋值;
{
System.out.print(person+"; ");
}
/********************* 开始循环报数 ************************/
int x=0, all=persons.length;
outer: //为打破死循环做个标记;
while(true)
{
for(int y=0;y<persons.length;y++)
{
if(persons[y])
{ x++;
if(x==3)
{ x=0;
persons[y]=false;
all--; }
}
}
if(all<2){ break outer; }//如果剩下的人数少于2人则循环结束;
}
/*********************** 输出最后结果 ************************/
System.out.println("\n结束的数组情况为:"+Arrays.toString(persons));
System.out.print("最后留下的人的编号为: ");
for(int y=0;y<persons.length;y++)
{
if(persons[y])
{
System.out.print((y+1)+";");
}
}
System.out.println("\n\n※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
input.close();//关闭Scanner流
}
}
以前做的,看一下……
作者:
姜蕾蕾
时间:
2014-5-9 23:50
把所有的人记为一个数组,全部为true,开始计数,数一个true,常数就加一个,常数每到三个,元素改为false,一直做循环,直到true总数变成一,
作者:
提菩--空
时间:
2014-5-12 13:31
谢谢大家
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2