Java数组逻辑问题求思路
- 提问者网友:寂寞撕碎了回忆
- 2021-05-04 22:46
- 五星知识达人网友:傲气稳了全场
- 2021-05-04 23:54
楼主只是问了这样一个问题,我不知道楼主的水平怎样,所以我用最通俗的语言去解释吧,希望你能看懂。
这是个经典的约瑟夫环问题,有很多种做法,可以用链表解决,或者是数组法,还可以用数学方法。具体你可以百度搜搜,不过看题目,你说的是数组,就用数组做吧,我认为,数组虽然运行效率不高,但是如果对刚接触这种题型的人来说,是可以非常好的培养思维能力的。因为它是模拟整个游戏过程,相对好理解。
这道题,最重要的一句话就是“从1开始数,数到4的倍数就退出”数到4的倍数退出,可以理解为,从1开始数数,数到4的人退出,然后下面一个人接着从1开始数,以此类推。这样想比较好理解。
这样,把这个过程分成了两个部分,一个部分是从1到3数数,另一个部分是,数到4的人退出。用代码怎么写呢?定义一个计数器cnt1,用来表示数数。此时,重点就是,要有个判断条件,满足什么什么条件的人数数(cnt1++),满足什么什么条件的人离开,并且从下个人重新开始数数,计数器清0(cnt1=0)。接下来的问题是,65个人,数完这65个人得又重头开始数,如果做一个for循环for(i=1;i<=65;i++)当第65个人报数的时候,满足这个条件的话i=1表示重新开始数数。因为有了这个条件,此程序此时变成了一个死循环,所以要再加个结束条件,就是再定义一个计数器cnt2,每当有人离开,计数器加1,cnt2==62的时候,break。这样就行了。好,下面代码。(注意是我是用C语言编写的,虽然我也学过JAVA,但是语法什么的都忘了,JAVA和C++很像的,都差不多)
#include<stdio.h>
void main(){
int i;
int cnt1=1;//从1开始数数
int cnt2=0;
int a[63];
for(i=1;i<=63;i++)
a[i-1]=i;//把数组标个号。
for(i=1;i<=63;i++)
{
if(cnt1<4 && a[i-1]>0)//在这个条件里,什么样的人才能够继续数数?一个就是还没有数到4的人cnt1<4,和没有退出游戏的人a[i-1]>0。
cnt1++;
else if(cnt1==4 &&a[i-1]>0)//什么样的人才能够退出?数数数到4的人cnt1==4和没有退出游戏的人a[i-1]>0,这个很好理解吧?
{
a[i-1]=0;//把退出游戏的人值赋为0,表示退出比赛了,
cnt1=1;//计数器清0,表示重新数数。
cnt2++;//计数器2实际上是个控制条件。
}
if(i==63)//如果数到63,则从头开始数
i=0;//这里说下,为什么i=0,而不是=1,因为,当循环for(i=1;i<=63;i++)重新开始,在for()内,已经定义了i=1,程序会自动给i加上1.
if(cnt2==62)//当计数器2也就是控制条件=62的时候,即游戏只剩下一个人的时候,游戏结束
break;
}
for(i=0;i<63;i++)
if(a[i]!=0)
printf("%d",a[i]);//输出最后剩下的那个人。
}
- 1楼网友:思契十里
- 2021-05-05 03:07
public class Test { public static void main(String args[]){ int n = 10; int m = 3; int s = 0; for(int i=2; i<=n; i++){ s = (s+m)%i;
} System.out.println("最后剩下的位置为: "+(s+1)); }
}
- 2楼网友:玩世
- 2021-05-05 01:31
int[] arr=new int[65];
int n=0;//退出的人数
for(int i=0;i<65;i++)
{
arr[i]=i+1;
}
for(int i=0;n<65;i++)
{
if(i%4==0)
{
arr[n]=0;
n++;
}
}
for(int i=0;i<65;i++)
{
if(arr[i]!=0)
System.Out.print(arr[i]);
}
- 3楼网友:骨子里都是戏
- 2021-05-05 00:28
主要代码:
for(int i=0;i<a[].length;i++){
a[i]=i+1;
while(a[i]>0){
if(a[i]%4==0){
a[i]=-1;
continute;
}
}
代码不全 提供思路!!!!!!!
}