版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1291985595/article/details/53644637
Description
有M盏灯,编号为1~M,分别由相应的M个开关控制。开始时全部开关朝上(朝上为开,灯亮),然后进行以下操作:编号凡是1的倍数的灯反方向拨一次开关;是2的倍数的灯再反方向拨一次开关;是3的倍数的灯又反方向拨一次开关,......,直到是M的倍数的灯又方向拨一次开关。请从键盘输入一个整数m代表灯的数量,求出最后为熄灭状态的灯(不亮)的数量以及编号并输出。
Input
输入一个整数m(1<=n<=100)。
Output
输出为两行,第一行是熄灭状态的灯的数量;第二行是最后为熄灭状态的灯的编号(每个数据以4列的域宽显示)。
Sample Input
100
Sample Output
10 1 4 9 16 25 36 49 64 81 100
HINT
输出控制为%4d
思路:我们可以让亮灯为1,熄灭的灯为-1。
C语言代码如下
#include<stdio.h>
int main()
{
int M;
int i,j,light[128],number=0;
scanf("%d",&M);
for(i=1;i<=M;i++) //对数组light进行赋值为1
light[i]=1;
for(i=1;i<=M;i++)
{
for(j=1;j<=M;j++)
{
if(j%i==0) //每次都第一个灯开始尝试,如果能被i整除,就关上(打开)灯
{
light[j]=-1*light[j];
}
}
}
for(i=1;i<=M;i++)
{
if(light[i]<0) //如果灯是熄灭状态,就记一次数
number+=1;
}
printf("%d\n",number);
for(i=1;i<=M;i++)
{
if(light[i]<0)
{
printf("%4d",i);
}
}
printf("\n");
return 0;
}
int main()
{
int M;
int i,j,light[128],number=0;
scanf("%d",&M);
for(i=1;i<=M;i++) //对数组light进行赋值为1
light[i]=1;
for(i=1;i<=M;i++)
{
for(j=1;j<=M;j++)
{
if(j%i==0) //每次都第一个灯开始尝试,如果能被i整除,就关上(打开)灯
{
light[j]=-1*light[j];
}
}
}
for(i=1;i<=M;i++)
{
if(light[i]<0) //如果灯是熄灭状态,就记一次数
number+=1;
}
printf("%d\n",number);
for(i=1;i<=M;i++)
{
if(light[i]<0)
{
printf("%4d",i);
}
}
printf("\n");
return 0;
}