天天看點

N盞燈的問題

問題描述:

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;
}

           

繼續閱讀