解法一:
解析一下题目
- 对编号为K的倍数的灯进行操作——这些灯都有一个K因子
- 初始灯的状态为开启,最后灯的状态为关闭——进行了奇数次操作
- 一次操作——一个因子
- 所求的灯需有奇数次操作——这些灯都有奇数个因子
所以,我们的解决办法显而易见,找出1~N范围内因子个数为奇数的编号。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> result;
int N = 0;
cin >> N;
for (int i = 1; i < N + 1; i++) {
int num = 0;
for (int j = 1; j < i + 1; j++) {
if (i % j == 0) {
num += 1;
}
}
if (num % 2 != 0) {
result.push_back(i);
}
}
for (vector<int>::iterator it = result.begin(); it != result.end(); it++) {
cout << *it << " ";
}
return 0;
}
用时参考:90ms
解法二:
在解法一的基础上思考
普通的数都是有成对的因子,且因子互不相同,则必有偶数个因子。
若一对因子相同,则必有奇数个因子。
所以,要找的数为完全平方数。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int N;
cin >> N;
if(N!=1){
cout<<1;
for (int i = 2; i <= sqrt(N); ++i) //使用sqrt(N)来计算输入数字N的平方根
{
cout<<" "<<i*i;
}
}
else{
cout<<1;
}
cout << endl;
return 0;
}
用时参考:33ms