网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月23日漏签0天
c语言吧 关注:801,621贴子:4,374,496
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 5回复贴,共1页
<<返回c语言吧
>0< 加载中...

求助:开关灯问题发现会漏掉一些输出,但找不到错误位置

  • 只看楼主
  • 收藏

  • 回复
  • 双马尾瘾者
  • 酱油
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
附题目,源代码放二楼
假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。
第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。
请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
【输入】
输入正整数N和M,以单个空格隔开。
【输出】
顺次输出关闭的灯的编号,其间用逗号间隔。


  • 双马尾瘾者
  • 酱油
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
#include<string.h>
int main()
{
int n,m,j;
scanf("%d%d",&n,&m);
int l[n+1];
memset(l,1,sizeof(l));
int i=0;
l[1]=0;
for(i=2;i<=m;i++){
j=i;
while(j<=n){
if(l[j]==1){
l[j]=0;
}
else{
l[j]=1;
}
j+=i;
}
}
printf("1");
for(i=2;i<=n;i++){
if(l[i]==0){
printf(",%d",i);
}
}
return 0;
}


2025-12-23 02:50:39
广告
不感兴趣
开通SVIP免广告
  • GTA小鸡
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
memset的单位是字节,而不是int。数组l的每个元素都是0x01010101,if(l[j]==1) 这个条件不会成立。
你需要反过来,memset(l, 0, sizeof(l)),这样数组l的每个元素都会为0。


  • 洪水证人
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
翻转灯状态的时候,用一个l[j] ^= 1表达式就能代替if else,这样速度快。只是个小技巧,不过异或运算就是干这个的。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 5回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示