您的位置:首页 > 编程语言 > C语言/C++

The Second Blog -数组实现约瑟夫问题-C语言

2014-06-05 20:06 351 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define    N    100    // 总人数
#define    M    7   // 数数周期   每数M个就要淘汰一个
int main()
{

int num
;
int index;
for (index=0; index<N; ++index)  //初始化进行编号
{
num[index] = index+1;
}
int count=N;//未被淘汰人数
int mod=0;    //计数器,记到周期数就淘汰
index=0;
while(count>1)
{
if(num[index]!=0)  //此人未被淘汰
{
mod++;
if(mod==M)
{
num[index]=0; //淘汰此人
mod=0; //重置计数器
count--; //总人数减一
}                    //数到3个人  变回零
index=(index+1)%N; //构成循环
}
else
{
index=(index+1)%N;
}
}
for(index=0;index<N;++index)
{
if(num[index]!=0)
printf("胜出者为%d",num[index]);
}

system("pause");
return 0;
}


//强制转换跳转方式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define    N    100    // 总人数
#define    M    7  // 数数周期   每数M个就要淘汰一个
int main()
{
int str
;
int i,count,mod; //下标,剩余人数,计数
for (i=0;i<N;++i)//初始化
{
str[i]=i+1;
}
count=N;
mod=0;
i=0;
while(count>1)
{
if (str[i]!=0)
{
mod++;
if(mod==M)//表示达到一个循环,此时应该淘汰此人,计数器清零
{
str[i]=0;
mod=0;
count--;
}
if (i==N-1)//如果 下标为9表示最后一个人  下一个人就强制跳转到1
i=0;
else
i++;//否则 下标++
}
else if(i==N-1)//如果下标为9是数组内容为0,则强制跳转到1
i=0;//
else
i++;//否则下标++
}
for(i=0;i<N;++i)
{
if (str[i]!=0)
{
printf(" the winner is %d \n",str[i]);
}
}


约瑟夫问题重点:

1.计数,每数M个人 就要淘汰一个人,所以要有一个计数器Mod

2.对于淘汰的人,要将数组的值赋为零,并且在下次报数经过时,直接跳过数组内容为0的数组

3.实现数组的循环访问,一种方法是通过取余,另一种方法强制在数组尾部,使数组下标重新回到头部

最好的方法应该是链表实现的 ,等学到那一部分,再进行实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: