ACM基础题——百灯判熄

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/a1291985595/article/details/53644637
今日推荐