开灯问题,有n盏灯,编号为1~n。第一个人把所有灯都打开,第二个人按下所有编号为2的倍数的开关(这

2025-02-25 09:54:34
推荐回答(3个)
回答1:

//以下代码 vc6.0中编译通过。。
#include 
#include 
#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;
}
没太明白你的意思,欢迎继续追问。

回答2:

#include 
#include 
#include 
#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;
}

回答3:

#include
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");
}