51nod 2489 小b和灯泡

小b有n个关闭的灯泡,编号为1…n。
小b会进行n轮操作,第i轮她会将编号为i的倍数的灯泡的开关状态取反,即开变成关,关变成开。
求n轮操作后,有多少灯泡是亮着的。
收起
输入
输入一个数字表示灯泡数n,其中1<n≤10000000
输出
输出一个数字表示最终亮着的灯泡数
输入样例
3
输出样例
1

思路:求亮着的灯泡数是在求1~n中每个数因子的个数,打表后会发现当i为奇数或sqrt(i)不是整数时,它的因子个数为偶数,而sqrt(i)为整数时因子个数为奇数,分析题意会发现当i的因子个数为偶数时,最准的状态为灭,而因子个数为奇数最准状态为亮,综合以上分析可得结论:求亮着的灯泡树是在求1 ~n中可开开方数的数量(sqrt(n))。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{  
	int n;
	cin >> n;
	cout << int(sqrt(n)) << endl;
	getchar();
	getchar();
}

打表分析

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 10000000;
int init[maxn];
int main()
{
	memset(init, 0, sizeof(init));
	int n;
	cin >> n;
	int count = n;
	for(int i=1;i<=sqrt(n);i++)
		for (int j = i; j*i <= n; j++)
		{
			if (i == j) init[i*j] += 1;
			else init[i*j] += 2;
		}
	for (int i = 2; i <= n; i++)
	{
		if (init[i] % 2==0)
		{
			count--;
		}
	}
	cout << count << endl;
	getchar();
	getchar();

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值