数组综合编程题:约瑟夫问题。问题描述:M个人围成一圈,从第一个人开始报数,报到n的人出圈,剩下的人继续从1开始报数,报到n的人出圈;如此往复,直到所有人出圈。

随便写的,根本没有想怎么优化

怎么直接怎么来

(模拟此过程,输出出圈的人的序号,M预先设定,n值由键盘输入)。测试用例:M=10, n=5,依次输出的是5,10,6,2,9,8,1,4,7,3。

#include<stdio.h>
#define M 10

int main(void)
{
  int student[M] = { 0 };  // z记录学生是否出局
  int n = 0;  // 记录n
  int number = M;  // 记录还未出局的人数
  int temp = 0;  // 变量
  scanf("%d", &n);
  int i = 0;
  while (0 < number)  // 当还有人未出局时
  {
    temp = n;  // 重置变量		

    while (1 < temp)  // 报数循环
    {
      temp--;
      while (1 == student[i])  // 跳过所有已出局
      {
        if (M - 1 == i)
          i = 0;
        else
          i++;

      }
      if (M - 1 == i)  // 循环
        i = 0;
      else
        i++;
    }
    while (1 == student[i])  // 跳过所有已出局
    {
      if (M - 1 == i)
        i = 0;
      else
        i++;

    }
    printf("  %d,", i+1);
    student[i] = 1;
    if (M - 1 == i)
      i = 0;
    else
      i++;
    number--;
  }

  return 0;
}

 

1
说点什么

avatar
1 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
1 Comment authors
danisjiang Recent comment authors

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
最新 最旧 得票最多
提醒