10个学生编号1-10围坐一圈,1-3报数,报3的退出,求最后剩下的是谁?

10个学生编号1-10围坐一圈,1-3报数,报3的退出,求最后剩下的是谁?完整程序

猴子选大王——CSharp数组

这个就是经典的约瑟夫环的问题啊。
C实现参考:http://blog.sina.com.cn/s/blog_6736ad610101agip.html

C语言版:
#include "stdio.h"//
#include "stdlib.h"//
void main(void){

int *p,n,s,i,j,k;
printf("How many people?\nn=");
scanf("%d",&n);
if(!(p=(int *)malloc(n*sizeof(int)))){
printf("Application memory failure...\n");
return;
}
for(i=0;i<n;p[i]=1+i++);
printf("Count off to?\ns=");
scanf("%d",&s);
for(i=j=k=0;;i++){//
if(i==n) i=0;
if(!p[i]) continue;
if(++j==s){
p[i]=j=0;
if(++k==n) break;
}
}
printf("The last one is: %d.\n",i+1);
free(p);

}

java语言版

public static void joseph(boolean[] array) {
for (int i = 0; i < array.length; i++) {
array[i] = true;
}

    int counter = 0;// 计数器
    int leftCount = array.length;// 剩余人数
    int index = 0;// 索引

    while (leftCount > 1) {
        if (array[index]) {
            counter++;
            if (counter == 3) {
                counter = 0;
                array[index] = false;
                leftCount--;
            }
        }
        index++;
        if (index == array.length) {
            index = 0;
        }
    }

    for (int i = 0; i < array.length; i++) {
        if (array[i]) {
            System.out.println("剩余人员的位置是" + (i + 1));
        }
    }
}

public static void main(String[] args) {
    boolean[] array = new boolean[10];
    joseph(array);
}

    C++版
    #include <iostream>

using namespace std;

void Solution1(int *arr, int length, int m);

int main() {
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
int m = 5;

Solution1(arr,10,m);
return 0;

}

/*

  • simulate the process */ void Solution1(int *arr, int length, int m){ int i = 0; int index = length; int mIndex = m; while(index>1){ mIndex = m; while(mIndex > 0){ if(arr[i] != -1){ mIndex--; if(mIndex == 0) arr[i] = -1; } i = (i+1)%length; } index--; } for(i=0;i<length;i++) if(arr[i] != -1) cout<<arr[i]; }

<?php

for($i=1;$i<11;$i++)
{
    $array[$i] = $i;        
}

$leave = $array;print_r($leave); exit; 
$i = 1;

while(1)
{
if(count($leave)>1)
{
foreach($leave as $k=>$vo)
{

        if($i == 3 )
        {
            unset($leave[$k]);
            $i =0;
        }
        $i++;
    }
}
else
{
    echo "<pre>";

}

}

<?php

for($i=1;$i<11;$i++)
{
    $array[$i] = $i;        
}

$leave = $array; 
$i = 1;

while(1)
{
if(count($leave)>1)
{
foreach($leave as $k=>$vo)
{

        if($i == 3 )
        {
            unset($leave[$k]);
            $i =0;
        }
        $i++;
    }
}
else
{
    echo "<pre>";

}

}

图片说明

http://www.cnblogs.com/EricYang/archive/2009/09/04/1560478.html

 #include <iostream>
#include <list>
using namespace std;

int CircleOut(int n,int m){
    if(n <= 0){
        return -1;
    }//if
    list<int> circle;
    // 初始编号
    for(int i = 0;i < n;++i){
        circle.push_back(i+1);
    }//for
    // 报数
    list<int>::iterator cur = circle.begin();
    while(n > 1){
        for(int i = 1;i < m;++i){
            ++cur;
            if(cur == circle.end()){
                cur = circle.begin();
            }//if
        }//for
        // 踢出局
        list<int>::iterator next = ++cur;
        if(next == circle.end()){
            next = circle.begin();
        }//if
        --cur;
        circle.erase(cur);
        --n;
        cur = next;
    }//while
    return *cur;
}

int main(){
    int n;
    int m = 3;
    while(cin>>n){
        cout<<CircleOut(n,m)<<endl;
    }//while
    return 0;
}

up