开关灯问题

描述:一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。

有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;

接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。

n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。

 

输入:电灯的数量

输出:亮着的电灯数量

样例输入:3

样例输出:1


思路1:

首先是输入2个数据,然后定义一个数组,介于灯只有2种状态,所以就定义成bool类型,然后初始化为0,代表灯起初全部是关闭状态。
接着是2个循环,外面的循环代表从编号为1的人开始,直到结束。
里面的循环代表从编号为1的灯进行操作,把符合要求的灯的状态改变为和原来相反的状态即可。
最后判断哪些灯是开的,将它的编号输出。

#include<stdio.h>

int getLightNum(unsigned int num)
{
	int light[65536]={0};
	int lightNum=0;
	for(unsigned int i=1;i<=num;i++)
		for(unsigned int j=1;j<num;j++)
			if(j%i==0)
			{
				if(light[j]==1)
				  light[j]=0;
				else
					light[j]=1;
			}
	for(i=1;i<=num;i++)
	{
		if(light[i]==1)
			lightNum++;
	}
	
	return lightNum;
}

void main()
{
  unsigned n=0;
  scanf("%u",&n);
  printf("%u\n",getLightNum(n));
}

思路2:

由题意最如果最后某一盏灯是亮着的,那么它一定是被切换了奇数次(第0次的时候全部都关着)
首先来看一下6这盏灯,它被切换的次数是第1次(轮),第2次,第3次和第6次。
可以看出如果某一轮6被切换了,那么该轮数一定可以整数6,即是6的约数,由于约数是成对出现的,所以6被关掉的次数是偶数次。
但是是对于像4,16这样的完全平方数,由于他们都有一个约数k 使得 K的平方等于该完全平方数,所以其被关掉的次数应该为奇数,因为K只能被算一次。
所以该问题的答案是只有1-n的完全平方数,才是亮着的。
即1,4,3,16,25,36,49,64,81,100...这些灯亮着。

*备注:
完全平方数:一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数,也叫做平方数。

代码如下:

#include<stdio.h>
#include<math.h>

int getPerfectSquare(int i)
{
	int x=0;
    for(int k=1; k<=i; k++)
	{
		int a = (int)sqrt(k); //完全平方数的判断
		if(a*a==k)
			x++;
	}
	return x;
}

int main()
{
	int n=0;
	scanf("%d",&n);

	int num = getPerfectSquare(n);
	printf("%d\n",num);
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值