c语言约瑟夫(Joseph)问题

来源:百度知道 编辑:UC知道 时间:2024/09/28 10:22:58
2、约瑟夫(Joseph)问题:编号为1、2…n的n个人围成一圈,从第1个人从1开始报数,报到m的人离开,接着从离开者的下一个人开始从1报数,报到m的人又离开……问最后留在圈中的人的编号是多少?例如:n=7,m=3时,最后剩下的人的编号是4。
#include <stdio.h>
#include <stdlib.h>
/*n表示最初有多少个人,m表示报数到多少的人离开,函数Joseph返回最后剩下的人的编号*/
int Joseph(int n, int m)
{
int count = ; /*count表示当前圈内剩下的人数*/
int num=0; /*num表示当前报的数*/
int i,j; /*i表示当前报数的人对应的下标*/
int *a, remain;
/*动态申请连续的n个存储单元用来存放每个人的编号,将空间首地址赋值给a*/
a = ;
for(i=0; i<n; i++) a[i] = i+1; /*a[i]保存第i个人的编号*/
i = 0; /*从下标为0的人开始报数*/
while(count>1) /*如果剩余人数大于1则循环*/
{
num++;
if(num == ) /*报数到m的人离开*/
{
/*将下标为i的元素删除*/
for(j=i+1; j<count; j++) a[j-1] = a[j];
; /*当前剩余人数减1*/
num = 1; /*下一个人重新从1开始报数*/
}
i = ; /*计算下一个要报数的人的下标*/
}
remain = a[0]; /*最后只剩下一个人,将其编号赋值给remain*/
麻烦把空出填起

#include <stdio.h>
#include <stdlib.h>
/*n表示最初有多少个人,m表示报数到多少的人离开,函数Joseph返回最后剩下的人的编号*/
int Joseph(int n, int m)
{
int count = n; /*count表示当前圈内剩下的人数*/
int num=0; /*num表示当前报的数*/
int i,j; /*i表示当前报数的人对应的下标*/
int *a, remain;
/*动态申请连续的n个存储单元用来存放每个人的编号,将空间首地址赋值给a*/
a = (int *)malloc(sizeof(int));
for(i=0; i<n; i++) a[i] = i+1; /*a[i]保存第i个人的编号*/
i = 0; /*从下标为0的人开始报数*/
while(count>1) /*如果剩余人数大于1则循环*/
{
num++;
if(num == m) /*报数到m的人离开*/
{
/*将下标为i的元素删除*/
for(j=i+1; j<count; j++) a[j-1] = a[j];
count--; /*当前剩余人数减1*/
num = 1; /*下一个人重新从1开始报数*/
}
i = m%count; /*计算下一个要报数的人的下标*/
}
remain = a[0]; /*最后只剩下一个人,将其编号赋值给remain*/
return remain;
}