题目如下
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号是2的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。编写函数int fun(int n, int k, int a[ ]) ,参数为:灯数n,人数k,数组a,其中数组a记录灯的开关状态,fun()函数计算并返回所有开着的灯中的最大编号,在主函数中调用fun(),输出开灯的最大编号,k≤n≤1000
说明:主函数如下所示,请只提供子函数的编写:
#include <stdio.h>
#include <stdlib.h>
int fun(int n, int k, int a[ ]) ;
int main()
{
int k,n,f;
scanf("%d%d",&n,&k);
int a[n];
printf(“亮灯的最大编号:%d\n”,fun(n,k,a));
return 0;
}
代码如下
int fun(int n, int k, int a[])
{
for(int h=0; h<n; h++)
a[h]=0;
for(int i=1; i<=k; i++) //代表人
for(int j=0; j<n; j++) //代表灯
{
if(((j+1)%i) == 0) //注意将j+1代表灯的序号
{
if(a[j]==0)
a[j]=1;
else
a[j]=0;
}
}
int d = n-1;
while(a[d]!= 1){
d--;
}
return d+1;
}
之前写的时候就忘了灯的序号与数组下标不匹配,哎,结果又忙了半天