开灯问题 c++

2023-12-26 14:08
文章标签 c++ 问题 开灯

本文主要是介绍开灯问题 c++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注:如果觉得有问题,可以一起讨论哦

 问题:有n盏灯,编号为1~n,第一个人把所有的灯打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(期中关掉的将被打开,打开的将被关掉)依此类推,一共有k个人,问最后有哪些灯开着,输入n和k,输出开着的灯的编号。k<=n<=1000

样例输入:

7 3

样例输出:

1 5 6 7


【分析】:用数组flag[],flag[0],flag[1],flag[2]....flag[n]表示灯1,2,3.。。。n是否开着。首先将他们全置为0,表示他们都开着,1则表示关了灯。

用例子来分析,7盏灯,3个人


因为flag[i]是会动态改变的,所以解题关键就是如何动态的去改变flag[i]的值

由图所见它和((i+1)%j==0)有关,如果i能整除j,那么flag[i]原来的值就要改变。

假设int a=((i+1)%j==0))=1

当j=2时,flag[2]由0变为1,flag[4]由0变为1,flag[6]由0变为1

当j=3时,flag[3]由0变为1,flag[6]由1变为0。

flag[i]到底和a有着什么样的关系?不难想象,他们是异或关系。

即flag[i]=((i+1)%j) xor flag[i]。

那我们要怎么样在代码中表示异或呢?

我们除了要判断i是否整除j,还要判断它是否和flag[i]的值是否一样,如果不一样,flag[i]就置1。

为了结果之间加空格,所以加了一个变量d,第一个结果肯定不能有空格,所以初始化d=0;当d=0时,不输出空格。d不等于0,就输出空格。

输入第一个结果后,d++;


所以代码很简单

       

                    /**开灯问题**/#include "stdafx.h"
#include <string.h>
#define maxn 1010
int flag[maxn];
int _tmain(int argc, _TCHAR* argv[])
{int n,k,d=0;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){flag[i]=0;//打开//printf("%d\n",flag[i]);for(int j=2;j<=k;j++){if((i+1)%j==0){if(((i+1)%j==0)==flag[i])flag[i]=0;else flag[i]=1;}//printf("%d[%d]:%d\n",j,i,flag[i]);}//结果之间加空格   if(flag[i]==0){if(d==0){printf("%d",i+1);d++;}else printf(" %d",i+1);}}printf("\n");return 0;
}


这篇关于开灯问题 c++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/539706

相关文章

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到