/*
需求:
n个人围成一圈来报数玩,如果哪个倒霉鬼数到3,
他就被拉出去杀头,变成真正的倒霉鬼,
然后计数又从下个倒霉鬼重新开始,
最后只留下一个倒霉蛋,让他在人间再干点倒霉事。
请问第几个报数的人是倒霉蛋?
==========================================
心情日记:
哈哈,我今天才晓得注释还可以用来写日记:)))
建议以后诸位朋友如果时间充裕,可以考虑用这个写写小说:)))
这个版块的同志有点少,就把这个程序发到这里吧,希望能挣点人气。
也希望伟大的版主能够弄点技术分。
思考这个鬼东西话费了我半个下午。
我是用一个循环解决的,感觉不错。
而且我这个这个程序如果再简单修改一下,
应该可以适用于n人m数的情况。
这个小问题听说还很有名的,
在这里有好几个人用不同的方法把他做出来。
好像有用递归的,也有一个哥们居然用面向对象的思想来实现。
可惜那个帖子我现在找不到了。
有好心人能找到帮忙把它捞上来吧。
我以前也曾留意过这道题,但是都放弃了。
当今天我又面对它时,我又陷入苦苦思考的漩涡里。
这个小问题看似简单,但是做起来却比较难。
=========================================
设计原理:
我经过冥思苦想之后,跟老毕学着找了一个数组,再自己决定使用三个指针。
先把那些倒霉鬼和那个倒霉蛋装到一个数组里,
然后依照自然数顺序给他们编上数字号码,以示区别。
在报数时如果哪个编号的倒霉鬼报到了吉祥数字,我们就用0把他的号码销掉。
同样的如果吉祥数字碰到的编号是0那么它会跟着pos指针继续寻找下一个倒霉鬼。
直到只剩下一个倒霉蛋为止。
pos:这个指针是数组元素前进的指针,
我用一个循环把它放到里面,每转一圈他就自加一下。
count:这个指针是计数器,也是阎王爷的户口本,用他来记录干掉的倒霉鬼的数量,
每干掉一个倒霉鬼他就自加一下。如果只剩下倒霉蛋,game 就 over。
off:报数器。每报到3就清0;
*/
class LuckNumber
{
public static void main(String[] args)
{
int[] arr = {1,2,3,4,5,6,7,8};//数组
int pos = 0;//角标指示器
int count = 0;//清零计数器
int off = 1;//报数器。初始值为1
while(count<arr.length-1)
{
pos++;//前进
//如果超出数组边界再想法从头报数。
if(pos>arr.length-1)
pos = pos%(arr.length-1)-1;
//如果元素位置上的数不是0,就开始报数
if(arr[pos]!=0)
off++;
//如果报到3,就将该位置的数清0
//并且记录下清0的个数
if(off==3)
{
arr[pos] = 0;//清零
off = 0;//报数器清零。小心,这里的值应该是0;
count++;//清0计数器
}
// System.out.println("pos = "+pos+" count = "+count+" off = "+off);
}
//打印数组
for (int i=0; i<arr.length; i++)
{
if(arr[i]!=0)
System.out.print(arr[i]);
}
}
}
|