开灯问题,有n盏灯,编号为1~n。第一个人把所有灯都打开,第二个人按下所有编号为2的倍数的开关(这
开灯问题,有n盏灯,编号为1~n。第一个人把所有灯都打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打...
开灯问题,有n盏灯,编号为1~n。第一个人把所有灯都打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号
展开
3个回答
2015-01-23
展开全部
//以下代码 vc6.0中编译通过。。没太明白你的意思,欢迎继续追问。
#include <stdio.h>
#include <string.h>
#define MAXN 1000+10
int a[MAXN];
int main()
{
int i, j, n, k, first = 1;
memset(a, 0, sizeof (a));
scanf("%d%d",&n, &k);
for (i=1; i<=k; i++)
for (j=1; j<=n; j++)
if (j%i==0) a[j]=!a[j];
for (i=1; i<=n; i++)
if (a[i]) {
if (first) first = 0;
else printf(" ");
printf("%d", i);
}
printf("%\n");
return 0;
}
更多追问追答
追问
不知道为什么要这样做
追答
楼下已给出注释。。自己理解一下吧。。。
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 1000+10
int main()
{
int i,j,n,k,first=0;
int a[max];
scanf("%d%d",&n,&k);
memset(a,0,sizeof(a)); //0代表关灯,1代表开灯
for(i=1;i<=k;i++) //k个人
for(j=1;j<=n;j++) //n个灯
if(j%i==0)
a[j]=!a[j]; //取反,0变1,1变0,原来开变关,关变开
for(i=1;i<=n;i++) //最后输出a[i]的值就可以了
if(a[i])
printf("%d ", i); //不明白你的代码里面first是干嘛用的
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
main()
{
int i,j=2,x[1001],n,d,r;
scanf("%d%d",&d,&r);
for (i=1;i<=d;i++)//灯的编号
x[i]=i;
while (j<=r)
{
for (i=j;i<=d;i++) //灯数从等于人数开始
{
if (i%j==0) //是人的倍数
{
if (x[i]!=0)//不为0则要关灯
x[i]=0;
else //为0则要开灯
x[i]=i;
}
}
j++; //下一个人数
}
for (i=1;i<=d;i++)
if (x[i]!=0)
printf("%d ",x[i]);
printf("\n");
}
main()
{
int i,j=2,x[1001],n,d,r;
scanf("%d%d",&d,&r);
for (i=1;i<=d;i++)//灯的编号
x[i]=i;
while (j<=r)
{
for (i=j;i<=d;i++) //灯数从等于人数开始
{
if (i%j==0) //是人的倍数
{
if (x[i]!=0)//不为0则要关灯
x[i]=0;
else //为0则要开灯
x[i]=i;
}
}
j++; //下一个人数
}
for (i=1;i<=d;i++)
if (x[i]!=0)
printf("%d ",x[i]);
printf("\n");
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询