机试中级题

1.一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;
如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。
输入:电灯的数量
输出:亮着的电灯数量
样例输入:3
样例输出:1

/*
一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。 
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;
如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。 
输入:电灯的数量 
输出:亮着的电灯数量 
样例输入:3 
样例输出:1 
by phoebe
思路:
在这道题上面多思考思考,可以看出,对于任何一个灯来说,比如12,其因数有1,2,3,4,6,12。
说明,编号为1,2,3,4,6,12的学生分别要拉它一下,在这里发现,1*12=12,2*6=12,3*4=12,
所以其因数都是一一对应的,也就是,1拉的那一下被12抵消了,2拉的那一下被6抵消了,
那么谁不会被抵消呢?答案是平方数,比如9的因数是1,3,9,那么3*3=9,而3只拉一次,所以不会被抵消。
因此,这道题的答案就是,输入的n以内的平方数个数,等于(int)sqrt(n)。 
方法二:求有几个公因数,奇数个则打开,偶数个则关闭
*/
void open_close()
{
	int n;
	cin>>n;
	int count = 0;
	while(n <= 0)
	{
		cin>>n;
	}
	for(int i = 1; i <= n; i++)
	{
		if (i == sqrt(i) * sqrt(i))
		{
			count++;
		}
	}
	cout<<endl;
	cout<<count<<endl;
		
}
//方法二:
void open_close1()
{
	int n;
	cin>>n;
	int count = 0;
	int a[65536] = {0};
	while(n <= 0)
	{
		cin>>n;
	}
	for(int i = 1; i <= n; i++)//i表示学生
	{
		for(int j = i; j <= n; j += i)//j表示灯,第i个学生拉动第j及j的倍数的灯
			a[j] = 1 - a[j];

	}
	for(int i = 0; i <= n; i++)
	{
		if(a[i] == 1)
			count++;
	}
	cout<<count;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值