老师们帮小弟我看看这段代码什么有关问题

老师们帮我看看这段代码什么问题?
这是华为的上机样题:
一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。
注:电灯数和学生数一致。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> light; 
vector<int>::size_type n;
cout<<"请输入学生数/灯数:"<<endl;
cin>>n;
for(vector<int>::size_type s=0;s!=n;s++)
light.push_back(0);            //初始所有的灯为关
for(vector<int>::size_type i=1;i!=n;i++){
for(vector<int>::size_type j=i;j*i!=n;j*=i){       //每个学生拉一下其编号的倍数所对应的灯
light[j*i]=light[j*i]^1;        //每拉一次开关后灯的状态
}
}
int count=0;
for(vector<int>::size_type c=0;c!=n;c++){
if(light[c]==1){
count++;      //light值为1的灯为亮着的
}
}
cout<<"还有"<<count<<"台灯亮着"<<endl;
return 0;
}

最后运行结果只能输入n,然后就没反应了
------解决方案--------------------
j 一直为1 ~    你下个断电走一下就知道了~
------解决方案--------------------
#include <stdio.h>
int main()
{

int num = 0 , n = 0;
scanf("%d",&n);
for (int i = 1 ; i*i<=n;i++)
{

num ++;

}
printf("%d",num);
return 0;
}

只用完全平方的数 才可能最后亮着的 因为它的因数是奇数个
------解决方案--------------------
自己设断点查啊