开关灯问题(c语言)
样例:10 10 ,输出:1,4,9
5 5 ,输出:1,4
代码如下
#include<stdio.h>
//引入bool值的概念
#include<stdbool.h>
int main()
{
int n = 0;//n为灯的数量
int m = 0;//m为人的数量
int i;
scanf("%d %d", &n, &m);
//如果只有一个人
//肯定全部灯是关闭的
if (m == 1)
{
for (i = 0; i < n; i++)
{
printf("%d", i+1 );
}
printf("%d", n);
return 0;
}
//从第二个人开始要进行取反操作,如果灯关着,那么就把灯打开
else
{
//bool数组的创建
bool light[5000];
for (i = 0; i < n; i++)//数组的遍历
{
//因为第一个人把灯全关了,所以把bool数组初始化为false
light[i] = false;
}
int j = 1;
while(j!=m)
{
j++;
//从第二个人开始
for (i = 1; i < n; i++)
{
if (i % j == 0)//判断是否为几的倍数。
{
light[i] = !light[i];//逻辑取反操作,把开的灯关着,关的灯开起来
}
}
}
int flag = 0;
for (i = 1; i < n; i++)
{
if (light[i] == false && flag == 0)
{ //格式问题,第一个不输出“,”
flag = 1;
printf("%d", i);
}
else if (light[i] == false)
{
printf(",%d", i); //依次输出灯关闭的下标
}
}
}
return 0;
}