题目描述
有n盏灯,编号依次为1,2,3,...,n;初始化时,所有灯都是关闭状态;
小明第一次将编号为1,2,3,...,共n盏灯都打开了;第二次将编号为2,4,6,....,共n/2盏灯都关闭了;第三次将编号为3,6,9,...,共n/3盏灯进行操作,若是之前关闭状态则打开,若是打开状态,则关闭;第四次将4,8,12,....,共n/4盏灯进行操作。这样操作了n次,问最后亮了几盏灯。
输入描述
第一行输入整数T,表示有T组测试用例;1<=T<=100
接下来T行,每行有一个整数n,表示当前测试用例有n盏灯;1<=n<=1000
输出描述
输出n行,每次测试用例最后亮灯的数目。
样例输入
2
1
5
样例输出
1
2
分析:1-n的正整数序列,对于每一盏灯,就是每一个整数t,能对其进行操作的是第1,t,i(i是其除1和其本身的因子)次。
第一次是开,第t次是反操作,所以两次消掉,剩下就看这个数t的非1非本身的因子有多少个。如果是奇数个,最后就是开着的。
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int light(int n);
int factorNum(int n);
int main()
{
int T;
cin >> T;
int n;
for (int i = 0; i < T; i++)
{
cin >> n;
cout << light(n) << endl;
}
return 0;
}
//最后亮着的灯的个数
int light(int n)
{
int num = 0;
for (int i = 1; i <= n; i++)
{
if (factorNum(i) % 2 == 1)
num++;
}
return num;
}
//判断因数个数
int factorNum(int n)
{
int num = 0;
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
num++;
}
return num;
}
但是对于有时间限制的,数据较大的时候,这样是通不过的。