int main(void)
{
bool isInGroup[20]
int i
for (i = 0 i 档岩漏< 20 i++)
isInGroup[i] = true
int personNumberInGroup = 20
int pos = -1
while (personNumberInGroup != 0)
{
for (i = 0 i <枣郑 3 行烂++i)
{
pos = (pos+1)%20
if (isInGroup[pos] == false)
i--
}
printf("%d ", pos)
isInGroup[pos] = false
personNumberInGroup--
}
return 0
}
约瑟夫环问题:length个人围成一圈,分别编号1到length,谈蔽闷含弯从1开始报数报到seg的出去,继续报,问最后剩下的是原来的几号?
#include "stdio.h"
#define MAX 20
/*length个人围成一圈,报到seg退出,返回最后留下人的序号(>=1)*/
int JohnsonRing(int length, int seg){
int arr[MAX]
int i, k, n
/*设置每一个人的出局标志:0在列,1退出*/
for(i=0i<lengthi++){
arr[i] = 0
}
i = 0
k = 1
n = length
while(n >1) {
if(arr[i] == 1){/*当前位置并册的人已退出,移到下一位置 */
i = (i + 1) % length
continue
}
if(k == seg){/*当前位置的人退出*/
arr[i] = 1
n--
printf("%d\n", i+1)
i = (i + 1) % length
k = 1
}
else{/*继续报数*/
k++
i = (i + 1) % length
}
}
for(i=0i<length &&arr[i]==1i++)
return i+1
}
void main()
{
int remain
printf("sequence :\n")
remain = JohnsonRing(10, 7)
printf("remain : %d\n", remain)
}
#include <stdio.h>void main()
{
int i,k,m,n,num[50],*p
printf("请输入人数数量:")
scanf("%d",&n)
p=num
for(i=0i<ni++)
*(p+i)=i+1//以1至17为序给每个人编号
i=0 //i为每次循环时的计袭拍数变量
k=0 //k为按1,2,3报数时的计数变量
m=0 //m为退出人数
while(m<n-1)//当循环体人数比源瞎n-1少时(即未退出人数大于1时)执行循环体
{
if(*(p+i)!=0)
k++
if(k==3)//对退出的人的编号置0
{
*(p+i)=0
k=0
m++
}
i++
if(i==n)//报数到尾后,i恢复0
i=0
}
while(*p==0)
p++
printf("最后留下来的雹禅空第%d个人\n",*p)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)