有20盏灯,编号为1-20.
第1个人把所有灯打开,第2个人按下所有编号为2的倍数的
开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的
开关(关掉的灯将被打开,开着的灯将被关掉,依次类推).
一共有k个人(k由用户输入,2<k且k<20),问最后哪些灯还
开着?
C语言开灯问题20盏灯
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注 主要思路
建立一个足够长的数组,由于第一个人把灯全部打开,可以将长度为n的部分赋值为1,代表灯开
而后在循环中,寻找2,4,6…3,6,9…等等位置的开关取反
在循环结束后,遍历数组,输出为1的位置即可#include<stdio.h> #include<string.h> #define maxn 1005 int a[maxn]; int main(){ int n,k,first=1; scanf("%d%d",&n,&k); /*for(int i=1;i<=n;i++){ a[i]=1; }*/ memset(a,1,sizeof(a));//memset(*array,i,siezeof())用于将内存中连续一段赋值 for(int i=2;i<=k;i++){ for(int j=i;j<=n;j*=i){ if(a[j]==0){ a[j]=1; } else{ a[j]=0; } } } for(int i=1;i<=n;i++){ if(a[i]){ //first变量的作用在于标识第一个输出的i,因为输出格式要求空格间隔,故除了第一个输出外,所有输出前应输出一个空格 if(first) first=0; else printf(" "); printf("%d",i); } } return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
- ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
- ¥15 cmd cl 0x000007b
- ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
- ¥500 火焰左右视图、视差(基于双目相机)
- ¥100 set_link_state
- ¥15 虚幻5 UE美术毛发渲染
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号