约瑟夫问题的数组实现
2008-10-04 20:08
253 查看
问题描述:
这是一个非常经典的问题[/b]:设n个人围成一个圆圈,按一定的方向从第S个人开始报数,报到M为止,报数为M的人出列,然后从下一个人开始重新报数,报数为M的人又出列......直到所有的人全都出列为止。约瑟夫问题要对任意给定的N,S,M,求按出列次序得到的人员顺序表。
/* ==================================================== */
/* 程序名称: arrayList.c */
/* 程序目的: 用数组实现约瑟夫[/b]问题[/b] */
/* 程序作者: aimt ( computer 021 ) */
/* ==================================================== */
#include<stdio.h>
#define size 100 /* 输入人数的上限 */
void main()
{
int person[size];
int i, j; /* 循环修正变量 */
int arrayLen; /* 数组长度 */
int start, overNum; /* 开始位置各跨过位置 */
int deleNum; /* 出列人所在数组中的下标 */
int name, total; /* 输入时,人的信息以及人的总数 */
printf( "请输入圆桌上人的总数: " );
scanf( "%d", &arrayLen ); printf( "\n" );
if( ( arrayLen > size ) || ( arrayLen < 0 ) )
{
printf( "超出范围,请重新输入: " );
scanf( "%d", &arrayLen ); printf( "\n" );
};
printf( "请输入各个人的信息(整数): \n" );
for( i = 0; i < arrayLen; i++ )
{
scanf( "%d", &name );
person[i] = name;
}
printf( "你输入的数据的顺序为: \n" );
for( i = 0; i < arrayLen - 1; i++ )
printf( " %d ==>", person[i] );
printf( "%d \n", person[arrayLen - 1] );
printf( "你打算从第几个人开始? 请输入开始号: " );
scanf( "%d", &start );
printf( "\n" );
start = start - 1;
printf( "请输入相邻两出列人之间的间隔: " );
scanf( "%d", &overNum );
printf( "\n" );
total = arrayLen;
printf( "程序运行后,出列人的顺序为:\n\n" );
for( i = 0; i < total; i++ ) /* 要打印total个人的情况,故做total次 */
{
if ( arrayLen == 1 )
printf( "%d", person[0] ); /* 如果是数组只剩一个元素,直接出列 */
else
{
deleNum = ( start + overNum - 1 ) % arrayLen; /* 此取模保证循环 */
printf( "%d ==> ", person[deleNum] );
for ( j = deleNum; j < arrayLen; j++ ) /* 将出列元素后面的各元素前移 */
person[j] = person[j+1];
start = deleNum;
arrayLen = arrayLen - 1; /* 移动完毕后,数组长度减1 */
}
}
printf( "\n\n" );
}
从一本数据结构书上看到的用向量实现此问题:
void Josephus (Vector <int> &P, int n, int s, int m)
{
//将人员编号存入向量P;
int k = 1;
for(int i = 0; i<n, i++)
{P.Insert(k,i); k++;}
int s1 = s;
for(int j = n; j>=1; j--)
{
s1=(s1+m-1)%j;
if(s1== 0) s1 = j;
int w = P.Getnode(s1 - 1);
P.Remvoe(s1 - 1);
P.Insert(w,n-1);
}
}
这是一个非常经典的问题[/b]:设n个人围成一个圆圈,按一定的方向从第S个人开始报数,报到M为止,报数为M的人出列,然后从下一个人开始重新报数,报数为M的人又出列......直到所有的人全都出列为止。约瑟夫问题要对任意给定的N,S,M,求按出列次序得到的人员顺序表。
/* ==================================================== */
/* 程序名称: arrayList.c */
/* 程序目的: 用数组实现约瑟夫[/b]问题[/b] */
/* 程序作者: aimt ( computer 021 ) */
/* ==================================================== */
#include<stdio.h>
#define size 100 /* 输入人数的上限 */
void main()
{
int person[size];
int i, j; /* 循环修正变量 */
int arrayLen; /* 数组长度 */
int start, overNum; /* 开始位置各跨过位置 */
int deleNum; /* 出列人所在数组中的下标 */
int name, total; /* 输入时,人的信息以及人的总数 */
printf( "请输入圆桌上人的总数: " );
scanf( "%d", &arrayLen ); printf( "\n" );
if( ( arrayLen > size ) || ( arrayLen < 0 ) )
{
printf( "超出范围,请重新输入: " );
scanf( "%d", &arrayLen ); printf( "\n" );
};
printf( "请输入各个人的信息(整数): \n" );
for( i = 0; i < arrayLen; i++ )
{
scanf( "%d", &name );
person[i] = name;
}
printf( "你输入的数据的顺序为: \n" );
for( i = 0; i < arrayLen - 1; i++ )
printf( " %d ==>", person[i] );
printf( "%d \n", person[arrayLen - 1] );
printf( "你打算从第几个人开始? 请输入开始号: " );
scanf( "%d", &start );
printf( "\n" );
start = start - 1;
printf( "请输入相邻两出列人之间的间隔: " );
scanf( "%d", &overNum );
printf( "\n" );
total = arrayLen;
printf( "程序运行后,出列人的顺序为:\n\n" );
for( i = 0; i < total; i++ ) /* 要打印total个人的情况,故做total次 */
{
if ( arrayLen == 1 )
printf( "%d", person[0] ); /* 如果是数组只剩一个元素,直接出列 */
else
{
deleNum = ( start + overNum - 1 ) % arrayLen; /* 此取模保证循环 */
printf( "%d ==> ", person[deleNum] );
for ( j = deleNum; j < arrayLen; j++ ) /* 将出列元素后面的各元素前移 */
person[j] = person[j+1];
start = deleNum;
arrayLen = arrayLen - 1; /* 移动完毕后,数组长度减1 */
}
}
printf( "\n\n" );
}
从一本数据结构书上看到的用向量实现此问题:
void Josephus (Vector <int> &P, int n, int s, int m)
{
//将人员编号存入向量P;
int k = 1;
for(int i = 0; i<n, i++)
{P.Insert(k,i); k++;}
int s1 = s;
for(int j = n; j>=1; j--)
{
s1=(s1+m-1)%j;
if(s1== 0) s1 = j;
int w = P.Getnode(s1 - 1);
P.Remvoe(s1 - 1);
P.Insert(w,n-1);
}
}
相关文章推荐
- 约瑟夫问题的数学角度分析 C 数组实现 循环链表实现 递归实现时间复杂度O(logN)
- 约瑟夫问题(丢手帕问题)的数组实现
- 丢手帕问题(约瑟夫问题-数组实现)
- 数组实现的约瑟夫问题(Java)
- C++ HOJ 约瑟夫问题 的 数组、链表及STL实现
- 约瑟夫问题 算法很简单保证每个人都能看懂用的是模拟现实 用数组实现 利用循环删除数组中的元素
- 约瑟夫问题(数组实现)
- C语言实现:约瑟夫问题(数组和单链表2种方法)
- Josephus(约瑟夫)问题----分别用循环链表和数组实现
- 数组实现的约瑟夫问题(Java)
- 约瑟夫问题-数组实现
- 循环链表范例(约瑟夫问题) 数组实现
- 约瑟夫问题---数组实现
- The Second Blog -数组实现约瑟夫问题-C语言
- 约瑟夫问题的数组实现
- JAVA实现调整数组顺序使奇数位于偶数前面问题(《剑指 offer》)
- 有关环形数组的约瑟夫问题
- 关于约瑟夫_Joesphus问题(C语言数组解决)
- 循环链表实现约瑟夫问题,拉丁方阵问题
- codevs 1282 约瑟夫问题 树状数组正解 解题报告