算法竞赛入门经典: 第三章 数组和字符串 3.2开灯问题
2015-08-11 10:47
483 查看
/* 开灯问题: 有n盏等,编号为1~n。第一个人把所有灯打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯) 将被打开,开着的灯将被关闭,依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k<=n<=1000 输入:7 3 输出:1 5 67 */ //思路:决定一个灯开着,奇数次开,这个数能被几个数整除,设置标记数组,1表示开,0表示关 /* 关键: 1 通过memset为数组赋值,void* memset(void* buffer,int ch,size_t count) 2 iLightArr[i] = !iLightArr[i];//0,1转换不需要模2除得技巧 */ #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXSIZE 1000 + 10 void turnOnLight(int n,int k) { //int iLightArr[MAXSIZE] = {0};//初始化灯全部关闭为0 int iLightArr[MAXSIZE]; memset(iLightArr,0,sizeof(iLightArr)); for(int iDivide = 1 ; iDivide <= k ; iDivide++) { for(int i = 1; i <= n ; i++) { if(i % iDivide == 0) { //iLightArr[i] = (iLightArr[i] + 1) %2; iLightArr[i] = !iLightArr[i];//0,1转换不需要模2除得技巧 } } } for(int i = 1 ; i <= n ; i++) { if(iLightArr[i]==1) { printf("%d ",i); } } } int main(int argc,char* argv[]) { int n,k; scanf("%d %d",&n,&k); turnOnLight(n,k); system("pause"); return 0; }
相关文章推荐
- 21-IO流-11-IO流(字符流-缓冲区-解释)
- 21-IO流-12-IO流(字符流-缓冲区-BufferedWriter)
- Android应用评分
- 【Android进阶篇】WebView显示网页详解
- [笔记]VisionMobile:2015 H1开发者大趋势
- Binomial Coeffcients 过去山东省省赛冠军
- 大文件数据导出(后台执行,自动生成)
- 关于机器学习中规则与统计方法的思考
- 淘宝网页充值代码
- php5.5 + apache2.4 安装配置
- DCE中从linux sendto转换为dce的关节部分
- 省市区三级联动下拉框菜单javascript版
- Leetcode#5||Longest Palindromic Substring
- 文章标题
- 21-IO流-09-IO流(字符流-练习-复制文本文件_2)
- SDUTOJ懒虫小鑫
- Windows下搭建GCC + Eclipse + OpenOCD的ARM开发环境
- 开源领导者应该入乡随俗吗?
- git pull错误记录及解决
- Android 即时语音聊天工具 开发