用静态存储结构求解约瑟夫环问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 06:43:15

没人回答,答了算了,老问题了。
静态存储结构,那就用数组。
本题的一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。
# include <stdlib.h>
# include <stdio.h>
# define nmax 255
main()
{
int i,j,k,m,n,num[nmax],*p;
printf("\nInput number n and m:\n"); /* 这里输入总人数n和报数到几即退出的数m,手动输入 */
scanf("%d%d",&n,&m);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1; /* 人的位置编号从1开始到n */
i=0; /* i为扫描一遍计数器,初值置为0,最大值为n,计到n归0再次重计 */
k=0; /* k是计m计数器,记满m个归0重计 */
j=0; /* j表示从圈子中退出的总人数 */
while(j<n-1) /* 当退出的人数为n-1时结束循环,最后的那个没退出的就是所求 */
{
if(*(p+i)!=0) /* 从第一个值不为0的人开始计数 */
k++;
if(k==m)
{
*(p+i)=0; /* 每记满m个将第m个人的值置0,表示该人退出圈子 */
k=0; /* k记满m个归0重计 */
j++; /* 退出圈子人数加1 */
}
i++; /* 一遍循环计数器加1,指向下一个人 */
if(i==n) /* 如果一遍计数完成 */
i=0; /* 归0从数组开始重新循环,跳过值为0的那些位置为m的倍数的编号 */
}
while(*p==0) /* 跳过值为0的位置编号,使p指向值不为零即最后留在圈子中的人 */
p++;
printf("The