一个开关灯的c语言问题。。。没有思路~

一个开关灯的c语言问题。。。没有思路~述
假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。

第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。

请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。

输入
输入正整数N和M,以单个空格隔开。
输出
顺次输出关闭的灯的编号,其间用逗号间隔。
样例输入
10 10
样例输出
1,4,9

其实每个人做的事都是一样的,就是把灯的状态取反

如果M、N都等于10时,你可以这样想,接触第1盏灯的只有第一个人,接触第2盏灯的有1,2,第3盏灯的有1,3,第4盏灯有1,2,4,那接触了第n盏灯的就可以看出规律了,算一下1到n中有几个数可以被n整除就有几个人接触了第n盏灯,知道有多少人接触之后,再看一下人数是奇数还是偶数,偶数的话灯还开着

追问

怎么分开第几盏灯的次数?。还是写不出来

#include
int main()
{
int N,M,i,sum=0;
scanf("%d %d",&N,&M);
for( i=1;i<=N;i++)
{
for(int j=1;j<=i&j<=M;j++)
{
if(i%j==0)
{
// sum++;
}
}
}
/* if(sum/2!=0)
printf("%d,",i);*/
return 0;
}

追答改了一些地方,你对比一下看看
#include<stdio.h>
int main()
{
int N,M,i,sum=0;
scanf("%d %d",&N,&M);
for( i=1;i<=N;i++)
{
sum = 0 ;
for(int j=1;j<=i&&j<=M;j++)
{
if(i%j==0)
{
sum++;
}
}
if(sum%2!=0)
printf("%d,",i);
}
   
return 0;
}

追问

最后一个数没有逗号,那最后还需要加写个吗

追答

那最后一个数就另外写一个输出语句,不要加逗号
或者找到第一个要输出的数之后,不要输出逗号,剩下再找到其他的都输出逗号和数值

追问

抱歉,昨天有事。
但是怎么确定最后一盏有效(可输出)灯?

#include
int main()
{
int N,M,i,sum=0;
scanf("%d %d",&N,&M);
for( i=1;i<=N;i++)
{
sum=0;
//确保每个灯开始时关灯数为0
for(int j=1;j<=i&&j<=M;j++)
{
if(i%j==0)
sum++;
}
if(sum%2!=0)
{
if(i<N)
printf("%d,",i);
if(i==N)
printf("%d",i);
//有误!
}
}
return 0;
}

追答

最后一盏要确定比较难,我们可以设一个flag=0,把第一盏输出时让flag =1,只输出灯的序号,后面再有输出时,flag=1了,输出逗号加上灯的序号,这样就可以了

追问

怎么写?

追答

在for外面加上定义:int flag = 0 ;
找到要输出的灯时,按这样来弄:
if ( flag == 0 )
{
printf( "%d" , i ) ;
flag = 1 ;
}
else
{
printf( ",%d" , i ) ;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-10-29
这个我会,可以帮你写!追问

怎么做?

追答

看我头像

第2个回答  2016-10-29
c语言程序帮编写追问

什么?

追答

程序帮编写 私信我

相似回答