喝醉的狱卒 qiubangzhu

求帮助c语言
在一所监狱里有一条长长的走廊,沿着走廊排列着n个牢房,编号为1到n。每个牢房有一个囚犯,而且牢房的门都是锁着的。 一天晚上,狱卒很无聊,于是他就玩起了一个人的游戏。第一轮,他喝了一口威士忌,然后沿着走廊,将所有牢房的门打开。第二轮,他又喝了一口威士忌,然后又沿着走廊,将所有编号为2的倍数的牢房锁上。第三轮,他再喝一口威士忌,再沿着走廊,视察所有编号为3的倍数的牢房,如果牢房是锁着的,他就把它打开;如果牢房是开着的,他就把它锁上。他如此玩了n轮后,喝下最后一口威士忌,醉倒了。 当他醉倒后,一些犯人发现他们的牢房开着而且狱卒已经无能为力,他们立刻逃跑了。 给出牢房的数目n,请你确认最多有可能有多少犯人逃出了监狱?

#include <stdio.h>
int main(){
  int n;
  scanf("%d",&n);
  int c = 0;
  int a[n+1];
  a[0] = -1;
  for(int i=1;i<=n;i++){    //1-n个牢房都是关的
    a[i] = 0;
  }
  for(int i=1;i<=n;i++){    //第i口酒
    for(int j=i;j<=n;j+=i){ //是i的倍数,关的打开,开的关闭
      if(a[j]==0) a[j] = 1;
      else a[j] = 0;
    }
  }
  for(int i=1;i<=n;i++){     //统计有几个牢房是开的
    if(a[i] == 1) c++;
  }
  printf("%d\n",c);
  return 0;
}

img

img

#include<stdio>
#include <math.h>
int main()
{
    int n;
    scanf("%d",&n);
    printf("%d\n",(int)sqrt(n));
    return 0;
}