开灯关灯

题目描述

有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;
}

但是对于有时间限制的,数据较大的时候,这样是通不过的。

开灯关灯2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值