题目:约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称"丢手绢问题".)。
编号为1.2.3…….n的n个人按顺时针方向围坐一圈,开始任意选一个整数作为报数,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,从出列的下一个人开始报数,报到m的人再退出,如此下去直到剩下一个人为止,我们将n=8,m=3,为了更加方便画图。
一道题我们将需要的变量找出来之后,但是我们还是写不出来代码,此时是触发点(抓手)太多,故我们可以通过循环从低到高的推到求解,对每一个变量从底层去寻找规律
1@
hanhaoshu=1;
index=1;
hejiuren[index]=1;
hanhaoshu=2;
index=2;
hejiuren[index]=1;
hanhaoshu=0;
index=0;
对hejiuren index制0 //如果这一步不理解可以先看2@,再返回看这一步
1@ 我们可以将其规律总结出来,直接用一个while语句来实现运行
2@
while(count>0&&count<9) //此处是判断喝酒的人数还有多少,他有上界和下界
{
hanhaoshu++; //在进行这while这一步的时候,需要提前先将index和hanhaoshu变为0,
index++; //进行++之后才能符合题意,我们不能将赋值加到while循环里,这样会
hejiuren[index]; // 使每一次++变得无效
}
3@
while(hanhaoshu[index]==0)
{
index++;//当满足条件的时候,说明这个人已经喝醉了,此时这个人已经不算了
if(index>8)//因为index一直在增加但是 围桌喝酒的人最多只有八个人
{
index=1; //满足条件将index制1;再进入循环
}
}
4@
if(hanhaoshu==3)
{
hejiuren[index]==0;
printf("%-4d",index); //此步是去输出圆桌被喝倒的序号
count--; //只有8个人喝酒,且一直有人倒下,所以--
hanhaoshu=0;//此步要返回到原来的2@语句中-->他的作用和1@一样
}
将3@和4@包括在2@语句中就会筛选完全合适,也就是去掉2@末尾的‘{’ ,加在4@
代码实现
#include <stdio.h>
#include<string.h>
int main()
{
int hanhaoshu;
int hejiuren[8] = { 1,1,1,1,1,1,1,1 };
for(int i=0;i<8;i++)
{
hejiuren[i];
}
for(int i=0;i<8;i++)
{
printf("%-4d",hejiuren[i]);
}
printf("\n");
int index;
index = 0;
hanhaoshu = 0;
int count = 8;
while (count > 0)
{
index++;
hanhaoshu++;
while (hejiuren[index]== 0)
{
index++;
if(index>8){
index = 1; //满足条件将index制1;再进入循环
}
}
if(hanhaoshu==3)
{
hejiuren[index] = 0;
printf("%-4d",index);
count--;
hanhaoshu = 0;//此步要返回到原来的2@语句中-->他的作用和1@一样
}
}
}