小弟刚刚学java
写了一个围成圈小孩数术,每隔几个就出去,看看最后剩下谁的问题的程序
比如5个小孩,从第二个开始,每隔2个出局最后剩下第4个小孩希望大家看看有什么要改善的地方, 谢谢了
package javaApp;import java.lang.reflect.Array;public class kidsshu { /**
* @param args
*/
public static int aktuellePostion;//记录那个位置该改为去掉
public static int zeiger;//数术
public static int anfang;//开始位置
public static int abstand;//隔几个数
public static int kids;//一共多少kids
public static int[] arraykids;
public static void main(String[] args) {
// TODO Auto-generated method stub
kids=Integer.parseInt(args[0]);
System.out.println(kids);
abstand=Integer.parseInt(args[1]);
System.out.println(abstand);
anfang=Integer.parseInt(args[2]);
System.out.println(anfang);
arraykids=new int[kids];
for(int i=0;i<kids;i++){
arraykids[i]=1;
}
kidsshu kidsshu=new kidsshu();
int ok=kidsshu.letzter(kids, abstand, anfang);
System.out.println(ok);
}
public int letzter (int kids,int abstand, int anfang){
int letzter=0;
int outOfNumer=0;
zeiger=anfang-1;
aktuellePostion=zeiger;
int number=0;
while(outOfNumer<kids-1){ while (number!=abstand) {
if (arraykids[zeiger]!=0) {
number=number+1;
aktuellePostion=zeiger;
zeiger=zeiger+1;
if(zeiger==kids)
zeiger=0;
}
else {
aktuellePostion=zeiger;
zeiger=zeiger+1;
if (zeiger==kids) {
zeiger=0;
}
}
}
number=0;
arraykids[aktuellePostion]=0;
outOfNumer=outOfNumer+1;
}
for(int i=0;i<kids;i++){
if (arraykids[i]!=0)
letzter=i;
}
return letzter;
} }
写了一个围成圈小孩数术,每隔几个就出去,看看最后剩下谁的问题的程序
比如5个小孩,从第二个开始,每隔2个出局最后剩下第4个小孩希望大家看看有什么要改善的地方, 谢谢了
package javaApp;import java.lang.reflect.Array;public class kidsshu { /**
* @param args
*/
public static int aktuellePostion;//记录那个位置该改为去掉
public static int zeiger;//数术
public static int anfang;//开始位置
public static int abstand;//隔几个数
public static int kids;//一共多少kids
public static int[] arraykids;
public static void main(String[] args) {
// TODO Auto-generated method stub
kids=Integer.parseInt(args[0]);
System.out.println(kids);
abstand=Integer.parseInt(args[1]);
System.out.println(abstand);
anfang=Integer.parseInt(args[2]);
System.out.println(anfang);
arraykids=new int[kids];
for(int i=0;i<kids;i++){
arraykids[i]=1;
}
kidsshu kidsshu=new kidsshu();
int ok=kidsshu.letzter(kids, abstand, anfang);
System.out.println(ok);
}
public int letzter (int kids,int abstand, int anfang){
int letzter=0;
int outOfNumer=0;
zeiger=anfang-1;
aktuellePostion=zeiger;
int number=0;
while(outOfNumer<kids-1){ while (number!=abstand) {
if (arraykids[zeiger]!=0) {
number=number+1;
aktuellePostion=zeiger;
zeiger=zeiger+1;
if(zeiger==kids)
zeiger=0;
}
else {
aktuellePostion=zeiger;
zeiger=zeiger+1;
if (zeiger==kids) {
zeiger=0;
}
}
}
number=0;
arraykids[aktuellePostion]=0;
outOfNumer=outOfNumer+1;
}
for(int i=0;i<kids;i++){
if (arraykids[i]!=0)
letzter=i;
}
return letzter;
} }
public static void main(String[] args){
//初始化数据
List<String> people = new ArrayList<String>();
String[] names = {"卡卡西","佐助","鸣人","小樱"};
for(String name : names){
people.add(name);
}
int n=3; //数多少个就移除1个
int count = 0; //不用设置
int index = 0; //不用设置
while(people.size()>1){
count++;
if(count==n){
String t = people.remove(index--);
System.out.println("REMOVE : "+t);
count=0;
}
index = ++index%people.size();
}
System.out.println("LEAVE : "+people);
}
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);while(list.size()!=1){
for(int i=0;i<2;i++){
list.add(list.remove(0));
}
list.remove(0);
}
System.out.println("最后剩下的是:"+list.get(0));
int choose(int num,int del)
{
int i;
int a[100];
for(i=0;i<num;i++)
a[i]=1; //状态初始化,为1表示可能被选上,为0表明已经淘汰;int sum=0, //循环记数;
countOne=num; //累积记数初始化,大于1表明未被排除;while(countOne>1)
{
countOne=0;
for(i=0;i<num;i++)
{
sum+=a[i];
if(sum==del)
sum=a[i]=0; //淘汰报到该数的人;
countOne+=a[i];
}
}for(i=0;i<num;i++)
if(a[i]!=0)
return i; //找到幸运编号(从0开始的);
}void main()
{
int num,del;
cout<<"请输入总数和报数的数:";
cin>>num>>del;
cout<<"最后剩下的人的原来的编号为:"<<choose(num,del)+1<<endl;
}
这是C++的算法,LZ可以自己改下,变成java的算法,然后再跟自己的对照的看下
public static void main(String[] args) {
Vector<String> v = new Vector<String>();
// 赋值
String temp;
for (int i = 1; i <= 100; i++) {
v.add("第" + i + "个小孩");
}
// 计算
while (v.size() > 1) {
// 前两个不删
for (int i = 0; i < 2; i++) {
temp = v.get(0);
v.remove(0);
v.add(temp);
}
v.remove(0);
}
System.out.println(v);
}
}
public static void main(String args[]) {
int[] a = new int[7];
int sum = 0;
int M = 1;
for (int n = 0; n < a.length; n++) {
a[n] = 1;
}
int i = 0;
int j = 0;
do {
if (i == a.length)
i = 0;
sum += a[i];
if ((sum % M == 0)&&(a[i]!=0)) {
a[i] = 0;
System.out.println(i + "out");
j++;
}
i++;
} while (j < a.length);
System.out.println("The last out" + (i-1)+" And come out "+j+" SUM "+sum);
}
}
C 代码如下:
#define OVERFLOW -2
typedef int Status;
typedef int Elemtype;
//定义数据元素类型
typedef struct Cnode{
Elemtype data;
struct Cnode *next;
} CNode;CNode *joseph;//定义一个全局变量
Status Create_clist(CNode *clist,int n){
CNode *p,*q;
int i;
clist=NULL;
for(i=n;i>=1;i--){
p=(CNode *)malloc(sizeof(CNode));
if(p==NULL)
return OVERFLOW;//存储分配失败
p->data=i;
p->next=clist;
clist=p;
if(i==n)
q=p;//用q指向链表的最后一个结点
}
q->next=clist;//把链表的最后一个结点的链域指向链表的第一个结点,构成循环链表
joseph=clist;//把创建好的循环链表头指针赋给全局变量
return OK;
}//end
Status Joseph(CNode *clist,int m,int n,int k){
int i;
CNode *p,*q;
if(m>n)
return ERROR;//起始位置错
if(!Create_clist(clist,n))
return ERROR; //循环链表创建失败
p=joseph; //p指向创建好的循环链表
for(i=1;i<m;i++)
p=p->next; //p指向m位置的结点
while(p){
for(i=1;i<k-1;i++)
p=p->next; //找出第k个结点
q=p->next;
printf("%d ",q->data);//输出应出列的结点
if(p->next==p)
p=NULL; //删除最后一个结点
else {
p->next=q->next;
p=p->next;
free(q);
}
}//while
clist=NULL;
}//end
int main(int argc, char *argv[])
{
int m,n,k;
CNode *clist;
clist=NULL;
printf("\n请输入围坐在圆桌周围的人数n:");
scanf("%d",&n);printf("\n请输入第一次开始报数人的位置m:");
scanf("%d",&m);printf("\n你希望报数到第几个数的人出列:");
scanf("%d",&k);
Create_clist(clist,n);
printf("\n出列的顺序如下:\n");
Joseph(clist,m,n,k);
system("PAUSE");
return EXIT_SUCCESS;
}
import java.util.List;
public class Test {
void josephus(int m,int n,int t){
List<Integer> l=new LinkedList<Integer>();
for(int i=0;i<m;l.add(++i));
int t1=t-1;
for(int i=0;i<m;i++){
t1=(t1+n-1)%l.size();
System.out.print(l.get(t1)+"\t");
l.remove(t1);
}
}
public static void main(String args[]){
new Test().josephus(5,3,2);
}
}