C++刷题开关灯——蓝桥杯备战D7

C++刷题开关灯——蓝桥杯备战D7_第1张图片

解法一:

解析一下题目

  • 对编号为K的倍数的灯进行操作——这些灯都有一个K因子
  • 初始灯的状态为开启,最后灯的状态为关闭——进行了奇数次操作
  • 一次操作——一个因子
  • 所求的灯需有奇数次操作——这些灯都有奇数个因子

所以,我们的解决办法显而易见,找出1~N范围内因子个数为奇数的编号

#include 
#include 
using namespace std;

int main() {
    vector 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::iterator it = result.begin(); it != result.end(); it++) {
        cout << *it << " ";
    }

    return 0;
}

用时参考:90ms

解法二:

在解法一的基础上思考

普通的数都是有成对的因子,且因子互不相同,则必有偶数个因子。

若一对因子相同,则必有奇数个因子。

所以,要找的数为完全平方数。

#include   
#include   
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<<" "<

用时参考:33ms

你可能感兴趣的:(c++,蓝桥杯,算法)