趣味算法------开灯问题

题目描述

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

输入格式
输入一组数据:n 和 k,中间空格隔开。

输出格式
输出开灯的编号。

输入样例1
输入
4 3
输出
1
输入样例2
输入
7 3
输出
1
5
6
7
输入样例3
输入
10 6
输出
1
4
7
8
10
输入样例4
输入
15 1
输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
输入样例5
输入
21 5
输出
1
4
6
7
8
10
11
13
15
16
17
18
19

思路解析:

在开始之前我要介绍一个运算符符号"^",这个运算符号在C语言中表达的含义是异或,两个数字都为1或者0,异或值为0,一个为1另一个为0,异或值则为1。

为了方便大家理解,可以将开灯关灯的过程也包含在代码中(虽然运行会比较慢),我们可以定义一个一维数组表示一排灯,下标则为对应灯的编号。数组值1,0表示灯的状态分别是开灯和关灯,编写一个函数,模拟开灯关灯。

具体代码:

#include<stdio.h>

int arr100 = {0};

int n;

void fun(int k)

{

for(int i = k;i<=n;i+=k)

arri = 1^arri;//1变0,0变1

}//模拟第k个人开灯关灯操作。

int main(void)

{

int k;

scanf("%d%d",&n,&k);

for(int i = 1;i<=k;i++)

fun(i);//让k个人轮流执行开灯关灯操作。

for(int i = 1;i<=n;i++)

if(arri)//如果还有灯为开的状态,打印该编号。

printf("%d\n",i);

}

留言:

基础题也讲过不少了,之后我打算开启图论的内容,会比较难,不过当然还是从最简单的开始,修行在当下,诸君切莫急。

相关推荐
wabs6664 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing5 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
Tongzhi20265 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog6 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt7 小时前
自制交叉线路识别算法
算法
手写码匠7 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区8 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人9 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin039 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC10 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode