问题描述:
N盏灯排成一排,从1到N按顺序依次编号。有N个人也从1到N依次编号。第一个人(1号)将灯全部关闭。第二个人(2号)将凡是2和2的倍数的灯打开。第三个人(3号)将凡是3和3的倍数的灯做相反的处理(如果该灯为打开的,则将它关闭;如果该灯为关闭的,则将它打开)。以后的人都和3号一样,将凡是与自己编号相同的灯,以及是自己编号倍数的灯做相反处理。请编写程序实现。要求:程序中要显示每一个人所做工作的过程,例如:当第i个人操作时,则显示将i和i的倍数的灯做相反的处理过程;当第N个人操作之后,显示灯的最后状态。(建议:采用图形法,显示每一盏灯,并为每一盏灯加边框,用不同的颜色显示开灯或关灯)。
程序如下:
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
using namespace std;
int main()
{ int i,n,k,j;
int sum=0;
int Light[1000]={0};
cout<<"请输入要操作的灯盏数N:"<<endl;
cin>>n;
for (i = 0; i < n; ++i)
Light[i] = 0; //初始化打开
for (i = 1; i <= n; ++i) // N个人操作
{ cout<<endl;
cout<<"第"<<i<<"个人操作后剩下的灯亮着(编号)"<<endl;
sum=0;
int t=0;
for (j = 1; j <= n; ++j) // 每个人操作N盏灯
{
if (0 == j%i) // 若灯编号可以除尽人编号,则进行操作
{
Light[j-1] = !(Light[j-1]);
}
}
for(k=0;k<n;k++)
{
if(Light[k]!=0)
{
cout<<k+1<<" ";
t++;
}
if(t==10)
{
cout<<endl;
t=0;
}
}
//cout<<"第"<<i<<"个人操作后有第"<<k+1<<"盏灯亮着"<<endl;
//sum=sum+1;
//cout<<"第"<<i<<"个人操作后还有"<<sum<<"盏灯亮着"<<endl;
}
cout<<endl;
return 0;
}