c语言问题..

来源:百度知道 编辑:UC知道 时间:2024/05/24 22:37:03
有17个人围成一圈,从0号的人开始报数,凡报到3的倍数的人离开圈子,然后再数下去。直到最后只剩下一个人为止。问此人原来的位置是多少号

最好多写几种算法..或者 注释下也行 不要去抄答案 那样我也会做 ..
只要是你自己做的..我会给你加分的..

这是约瑟夫环问题,n=17,m=3,可以数组模拟,时间复杂度是O(mn),外层循环控制踢出人数(此题16),此人踢出标志数组mark[该人]=1,从下一个位置数m个mark[i]为0的,第m个mark标1,重复以上动作,直至踢出人数满足要求。
还有一个数学方法,直接计算最后剩余标号,时间复杂度是O(n)

r=0;
for(i=2;i<=n;i++)
{
r=(r+m)%i;
}
printf("the last winner is %d\n",r);
LZ可以试试

我回答过一次类似的,你看看是否有帮助。
http://zhidao.baidu.com/question/54712892.html

#include<stdio.h>
#include<stdlib.h>
#define N 17
#define S 0
#define M 3
int m,n,s,p[N];
int writedat(void);
void josegh(void)
{
int i,j,k,s1,w;
s1=s;
for(i=1;i<=n;i++)
p[i-1]=i;
for(i=n;i>=2;i--)
{
s1=(s1+m-1)%i;
if(s1==0)
s1=i;
w=p[s1-1];
for(j=s1;j<=i-1;j++)
p[j-1]=p[j];
p[i-1]=w;
}
}

int main()
{
m=M;n=N;s=S;
josegh();