C语言 百人拉百灯问题
题目:
有100人,编号从1到100; 另有100盏灯,编号也从 1到100. 现要求每人去拉能被自己编号整除的所有电灯, 例如编号为1者应把所有的灯都拉一遍, 编号为2者应把所有编号为偶数的灯都拉一遍,而 编号为100者只能拉编号为100的灯. 假设一开始 所有的电灯都是灭的,那么最后有几盏灯是亮的? 编号分别是多少?
要求:
定义两个函数:
void switch_light(int light[], int man);
int lights_on(int *light, int *on);
main()中定义一个数组light,各个元素的值表示
各盏灯的亮灭状态(比如1表示亮,0表示灭),再
定义另外一个数组on,各个元素的值表示最后亮
着的灯的编号。
switch_light()的作用是编号为man的人尝试拉可
以被他编号整除的灯,结果影响数组light各元素
的值;
lights_on()统计一共有几盏灯是亮的,并把亮着
的灯的编号存放到on中,返回值是亮着的灯总数。
程序:
1 #include <stdio.h> 2 #define LIGHT 100 3 int main(void) 4 { 5 int i, j, a[LIGHT + 1] = { 0 }, count = 0; 6 for (i = 1; i <= LIGHT; i++) 7 for (j = i; j <= LIGHT; j += i) 8 a[j] ^= 1; 9 printf("●:亮 ○:暗\n"); 10 for (i = 1; i <= LIGHT; i++) 11 { 12 if (a[i]) 13 { 14 printf("●"); 15 count++; 16 } 17 else printf("○"); 18 } 19 printf("\n总计 %d 盏灯亮着", count); 20 return 0; 21 }
1 #include <stdio.h> 2 int main() // main()中定义一个数组light,各个元素的值表示各盏灯的亮灭状态(比如1表示亮,0表示灭),再定义另外一个数组on,各个元素的值表示最后亮着的灯的编号。
3 { 4 void switch_light(int light[], int man); //声明拉灯函数
5 int lights_on(int *light, int *on); //声明统计函数
6 int i,man,light[101]={0},on[100],sum; 7 for(man=1;man<=100;man++) 8 switch_light(light,man); 9 sum=lights_on(light,on); 10 printf("last there are %d lights on!\n",sum); 11 printf("these lights are:"); 12 for(i=0;i<sum;i++) printf("%d ",on[i]); 13 } 14 void switch_light(int light[], int man) //switch_light()的作用是编号为man的人尝试拉可以被他编号整除的灯,结果影响数组light各元素的值;
15 { 16 int i; 17 for(i=man;i<=100;i++) 18 if(i%man==0) 19 { 20 if(light[i]==0) 21 light[i]=1; 22 else light[i]=0; 23 } 24 } 25 26 int lights_on(int *light, int *on) //lights_on()统计一共有几盏灯是亮的,并把亮着的灯的编号存放到on中,返回值是亮着的灯总数。
27 { 28 int i,j=0; 29 for(i=1;i<=100;i++) 30 if(light[i]==1) 31 { 32 on[j]=i; j++; 33 } 34 return(j); 35 }