实验说明
有 n 盏灯,编号 1~n。第 1 个人把所有灯打开,第 2 个人按下所有编号为 2 的倍数的开关,第 3 个人按下所有编号为 3 的倍数的开关,依次类推。按开关时其中关掉的灯将被打开,开着的灯将被关闭。一共有 k 个人,输出最后开着的灯的编号。n 和 k 在运行时输入,1≤k≤n≤1000。输出的时候每行输出 10 个序号且利用输出格式实现左对齐。
代码实现
/*n人开关灯实验*/
#include
#include
int main()
{
int arr[1000],lnum,pnum,count=0;
printf("输入灯的数目:");
scanf("%d",&lnum);
for(int i=0;i<lnum;i++) //赋初值
arr[i]=0;
printf("输入人的个数:");
scanf("%d",&pnum);
for(int m=1;m<=pnum;m++) //依次开关灯;
{
for(int n=1;n<=lnum;n++)
{
if(n%m==0)
{
if(arr[n-1]) arr[n-1]=0;
else arr[n-1]=1;
}
}
}
for(int i=0;i<lnum;i++) //输出开着的灯的编号
{
if (arr[i]!=0)
{
printf("%-4d",i+1);
count++;
if (count%10==0) printf("\n");
}
}
return 0;
}
实验结果
输入灯的数目:200
输入人的个数:10
1 4 9 11 12 13 14 15 17 18
19 20 21 23 27 29 31 35 37 41
42 43 44 47 52 53 54 56 59 60
61 67 68 70 71 72 73 75 76 79
81 83 89 90 92 97 98 99 100 101
103 107 109 112 113 116 117 121 124 127
131 132 137 139 143 144 147 148 149 151
153 154 156 157 162 163 164 165 167 168
169 171 172 173 175 179 181 182 187 188
191 193 195 197 198 199