C语言经典程序n个人n盏灯第一个人关掉所有的灯!第二个人把二的倍数的灯取反!第三个人把三的倍数取反

C语言经典程序n个人n盏灯第一个人关掉所有的灯!第二个人把二的倍数的灯取反!第三个人把三的倍数取反!以此类推!这个程序哪里错了!我使用因数的个数做的!奇数个是关的!偶数是开的!

你把问题想简单了
提点建议:对程序提问,最好是有一定的注释,并对自己的程序设计思想有所阐述,这样会比较方便别人的理解!
这道题的关键点是,如果第2个人开灯,那么第4、6、8号的灯都开了。等到第4个人开灯的时候,他会把第4、8号灯又都关上了!因此这是关键点!
所以我采取的设计思想是:设关灯为0,开灯为1;设灯的状态为a,那么对灯进行一次操作后变为|a-1|,如果灯一开始是关的(0),操作后变为|0-1|=1(灯开了),如果一开始灯饰开的(1),操作后变为|1-1|=0(灯关了)!代码如下:
#include<stdio.h>
#include<math.h>
#define Max 100

int main()
{
int n; //n个灯,n个人
printf("请输入n的值:");
scanf("%d", &n);
int a[Max]; //定义一个数组,放置n个灯的状态,0为关灯,1为开灯;

for (int i = 0; i < n; i++){ //将所有灯泡对应的状态设为0(即都关灯);
a[i] = 0;
}

for (int i = 2; i <= n; i++){ //从第2个人开始进行操作
for (int j = 1; j <= n; j++){ //遍历1~n,找出i的倍数。这里注意,由于数组的特性,j=1的话对应的是a[0]
if (j%i == 0)
a[j-1] = abs(a[j-1] - 1); //abs()是取绝对值,如果一开始是0,减1后取绝对值为1;如果一开始为1,减1后为0;
}
}
printf("0为关灯,1为开灯\n");
for (int i = 0; i < n; i++){
printf("%d ", a[i]); //输出每一盏灯的开关状态,你也可以自己统计开灯关灯的数目!
}
return 0;
}
如果有什么不懂追问吧追问

谢谢!我懂了!非常感谢!请问你也是这个专业的么!可以留下pp或者其他联系方式么!以后有不会的想请教您!可以么?

追答

1293866697

温馨提示:答案为网友推荐,仅供参考
相似回答