注:如果覺得有問題,可以一起討論哦
問題:有n盞燈,編號為1~n,第一個人把所有的燈打開,第二個人按下所有編號為2的倍數的開關(這些燈將被關掉),第三個人按下所有編號為3的倍數的開關(期中關掉的將被打開,打開的將被關掉)依此類推,一共有k個人,問最后有哪些燈開著,輸入n和k,輸出開著的燈的編號。k<=n<=1000
樣例輸入:
7 3
樣例輸出:
1 5 6 7
【分析】:用數組flag[],flag[0],flag[1],flag[2]....flag[n]表示燈1,2,3.。。。n是否開著。首先將他們全置為0,表示他們都開著,1則表示關了燈。
用例子來分析,7盞燈,3個人
因為flag[i]是會動態改變的,所以解題關鍵就是如何動態的去改變flag[i]的值
由圖所見它和((i+1)%j==0)有關,如果i能整除j,那么flag[i]原來的值就要改變。
假設int a=((i+1)%j==0))=1
當j=2時,flag[2]由0變為1,flag[4]由0變為1,flag[6]由0變為1
當j=3時,flag[3]由0變為1,flag[6]由1變為0。
flag[i]到底和a有著什么樣的關系?不難想象,他們是異或關系。
即flag[i]=((i+1)%j) xor flag[i]。
那我們要怎么樣在代碼中表示異或呢?
我們除了要判斷i是否整除j,還要判斷它是否和flag[i]的值是否一樣,如果不一樣,flag[i]就置1。
為了結果之間加空格,所以加了一個變量d,第一個結果肯定不能有空格,所以初始化d=0;當d=0時,不輸出空格。d不等于0,就輸出空格。
輸入第一個結果后,d++;
所以代碼很簡單
/**開燈問題**/#include "stdafx.h"#include <string.h>#define maxn 1010int flag[maxn];int _tmain(int argc, _TCHAR* argv[]){ int n,k,d=0; scanf("%d%d",&n,&k); for(int i=0;i<n;i++){ flag[i]=0;//打開 //PRintf("%d/n",flag[i]); for(int j=2;j<=k;j++){ if((i+1)%j==0){ if(((i+1)%j==0)==flag[i])flag[i]=0; else flag[i]=1; } //printf("%d[%d]:%d/n",j,i,flag[i]); } //結果之間加空格 if(flag[i]==0){ if(d==0){printf("%d",i+1);d++;} else printf(" %d",i+1); } } printf("/n"); return 0;}
新聞熱點
疑難解答
圖片精選