10个学生编号1-10围坐一圈,1-3报数,报3的退出,求最后剩下的是谁?完整程序
这个就是经典的约瑟夫环的问题啊。
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;
}
/*
<?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