2015盏灯,一开始全部熄灭,序号分别是1-2015,先把1的倍数序号的灯的开关全部按一次,然后把2的倍数的灯的开关全部按一次,然后把3的倍数的开关按一次,以此类推,最后把2015的倍数灯的开关按一次。问最后亮着的灯有多少盏?
- 43
- 44
- 45
- 46
首先第一种做法我们可以利用程序跑一遍整个过程
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i;
int j;
int sum;
bool v[2016] = {false};
for(i = 1; i <= 2015; i++)
{
for(j = 1; j <= 2015; j++)
{
if(j % i == 0)
{
v[j] = !v[j];
}
}
}
sum = 0;
for(i = 1; i <= 2015; i++)
{
if(v[i])
{
sum++;
}
}
cout<<sum<<endl;
return 0;
}
但仔细想想还是有其他更省时省内存的方法:(当然这种方法是我参考别人的。。。)
首先灯是全灭的,当按奇数次时,该灯就是亮的。所以我们寻找每盏灯编号的约数是不是奇数个就可以了,这也就等同于编号是不是平方数。(为什么呢,我们加入4,它的约数有 1 4 2,我们知道不相同的约数是两两对应的,而平方数有一个约数是对应自己的,这样的话它的约数不就是奇数个了吗)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i;
int sum = 0;
int j;
for(i = 1; i <= 2015; i++)
{
j = sqrt(i);
if(j*j==i)
{
sum++;
}
}
cout<<sum<<endl;
return 0;
}