描述:一条长廊里依次装有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;
}