C++面试宝典30题丨第一题:开灯

专栏导读

见得题目越多,考试时抽中的概率也越大。 每一题都有详细的解答思路和独有的视频讲解

本文收录于:C++面试宝典(送视频讲解)

☆☆☆购买专栏后,请加微信会私发讲解视频!

题目描述

一条名叫Mango的街上有 N 站灯。起始时,所有的灯都是关的 。每盏灯上都有着一个按钮,每按一次按钮灯将会进行一次相反操作,即开着变关着,关着变开着。这时,编号为 1 的人走过来,把是1的倍数的灯全部按一次按钮,编号为 2 的人把是 2 的倍数的灯全部按一次按钮,即编号为 k 的人把是 k 的倍数的灯都按一次按钮,直到第 N 个人为止。

问题:给定 N,求 N 轮之后,还有哪几盏是开着的,每两个答案之间用空格隔开。

保证:N≤30000000,时间限制:1s

初步思路

看到这一题是不是很想直接暴力枚举,即从1-N每个人都遍历一遍。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=30000000;
int n;
bool a[maxn+5];
int main()
{
	for(int i=1;i<=maxn;i++) a[i]=0;//初始化一下 
	cin>>n;
	for(int k=1;k<=n;k++)
	{
		for(int j=k;j<=n;j+=k)
		{
			a[j]=!a[j];
		}
	}
	for(int i=1;i<=maxn;i++)
	{
		if(a[i]==1) cout<<i<<" ";
	}
	return 0;
}

可惜,当我们运行代码时,用了远远不止1s,严重超时了。

找规律

☆方法☆:像这种N轮后那些灯还亮着的问题,包括类似约瑟夫的问题,都应该从小数入手。

我们可以从N=3时入手(这里用1表示开,0表示关):

|---------|----|----|----|
| 轮数/灯的编号 | 1号 | 2号 | 3号 |
| 第一轮 | 1 | 1 | 1 |
| 第二轮 | 1 | 0 | 1 |
| 第三轮 | 1 | 0 | 0 |

当N=4时:

|---------|----|----|----|----|
| 轮数/灯的编号 | 1号 | 2号 | 3号 | 4号 |
| 第一轮 | 1 | 1 | 1 | 1 |
| 第二轮 | 1 | 0 | 1 | 0 |
| 第三轮 | 1 | 0 | 0 | 0 |
| 第四轮 | 1 | 0 | 0 | 1 |

当你继续往后列举时,你会惊讶的发现,这些数都是平方数,好Amazing!

小Tip:如果你不想手动列举的话,你可以用暴力的那个程序,让程序去算。

AC代码

于是,代码就变得很短很短啦!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		if(sqrt(i)*sqrt(i)==i) cout<<i<<" ";
	}
	return 0;
}

小结尾

🏆今天带你学习了一道很有趣的思维题,也学会了一个小技巧:交给程序算

🏆如果你觉得本篇文章对你有帮助的话,记得给我点个赞哦!

🏆欢迎订阅C++面试宝典(送视频讲解),暑假有优惠哦!配有亲自讲解视频!

相关推荐
kylezhao20192 小时前
C# 中的 SOLID 五大设计原则
开发语言·c#
千寻girling2 小时前
Koa.js 教程 | 一份不可多得的 Node.js 的 Web 框架 Koa.js 教程
前端·后端·面试
王老师青少年编程2 小时前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)
c++·题解·真题·csp·信奥赛·csp-s·提高组
程序员清风2 小时前
北京回长沙了,简单谈谈感受!
java·后端·面试
凡人叶枫2 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
CSDN_RTKLIB2 小时前
使用三方库头文件未使用导出符号情景
c++
春日见2 小时前
车辆动力学:前后轮车轴
java·开发语言·驱动开发·docker·计算机外设
锐意无限2 小时前
Swift 扩展归纳--- UIView
开发语言·ios·swift
低代码布道师2 小时前
Next.js 16 全栈实战(一):从零打造“教培管家”系统——环境与脚手架搭建
开发语言·javascript·ecmascript
网络安全-杰克3 小时前
2026面试自动化测试面试题【含答案】
自动化测试·软件测试·面试·职场和发展