题目
题目描述
首先所有的灯都是关的(注意是关!),编号为 1 的人走过来,把是 1 的倍数的灯全部打开,编号为 2的人把是 2 的倍数的灯全部关上,编号为 3的人又把是 3的倍数的灯开的关上,关的开起来……直到第 N 个人为止。
给定 N,求 N 轮之后,还有哪几盏是开着的。
输入格式
一个数 N,表示灯的个数和操作的轮数。
输出格式
若干数,表示开着的电灯编号。
输入输出样例
输入 #1
5
输出 #1
1 4
说明/提示
【数据范围】
对于 100% 的数据,1≤N≤。
题解
思路
· 定义一个数组a[N],表示N盏灯,但必须是bool类型的,表示灯的两种状态。
再使用for循环(双层),代表1~N编号的人。
接下来判断:当灯数是人的编号的倍数时,将灯的状态变化一次。
示例代码
#include<bits/stdc++.h>//万能头
using namespace std;
bool a[10000];//代表灯的状态
int main(){
int N;
cin>>N;
for(int i=1;i<=N;i++){//编号为1~N的人
for(int j=1;j<=N;j++){//灯的编号
if(j%i==0){//判断编号是否能被人的编号整除
a[j]=!a[j];//改变灯的状态
}
}
}
for(int i=1;i<=N;i++){
if(a[i]){//判断灯是否开着
cout<<i<<' ';
}
}
return 0;
}
等一下!!!
这是道数学题!!!!!
数学解法
我们知道,灯的开关按偶数次,灯就会被关掉;
按奇数次,灯就会开着。
那么,开着的灯就会有奇数个因数?
那只能是平方数啊!!
经过数学处理后的代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
cin>>N;
for(int i=1;i<=sqrt(N);i++){//sqrt()函数代表一个数的平方根
cout<<i*i<<' ';
}
return 0;
}