描述
有 M 盏灯,编号为:1 - M,分别由相应的 M 个开关控制。开始时全部开关朝上(朝上为开,灯亮),然后进行以下操作: 编号凡是 1 的倍数的灯反方向拨一次开关;是 2 的倍数的灯再反方向拨一次开关;是 3 的倍数的灯又反方向拨一次开关,......, 直到是 M 的倍数的灯又反方向拨一次开关。 请从键盘输入一个整数 m 代表灯的数量,求出最后为熄灭状态的灯(不亮)的数量以及编号并输出。
输入
输入一个整数m(1≤m≤100)。
输出
输出为两行,第一行是熄灭状态的灯的数量; 第二行是最后为熄灭状态的灯的编号(每个数据以4列的域宽显示)。
输入输出示例
输入 | 输出 | |
示例1 | 100 |
|
方法一
#include<stdio.h>
int main(){
int m,i,j;//i为灯的编号,j为开关等的次数
scanf("%d",&m);//灯的盏数
int a[m+1],k=0;
for(i=1;i<=m;i++)a[i]=1;//灯奇数为亮
for(j=1;j<=m;j++)
for(i=1;i<=m;i++)
if(i%j==0)
a[i]++;//进行开关灯操作
for(i=1;i<=m;i++)
if(a[i]%2==0)//判断灯是否熄灭
k++;//计数
printf("%d\n",k);
for(i=1;i<=m;i++)
if(a[i]%2==0)
printf("%4d",i);//输出编号
}
方法二
#include<stdio.h>
int main(){
int m,i,j;//i为灯的编号,j为开关等的次数
scanf("%d",&m);//灯的盏数
int a[m+1],k=0;//k为计数器
for(i=1;i<=m;i++)a[i]=1;//灯1为亮,0为熄
for(j=1;j<=m;j++)
for(i=1;i<=m;i++)
if(i%j==0)
a[i]=!a[i];//进行开关灯操作
for(i=1;i<=m;i++)
if(a[i]==0)//判断灯是否熄灭
k++;//计数
printf("%d\n",k);
for(i=1;i<=m;i++)
if(a[i]==0)
printf("%4d",i);//输出编号
}