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 }

 

 

转载于:https://www.cnblogs.com/yfzhang/p/3960989.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值