国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

開燈問題 c++

2019-11-08 02:34:31
字體:
來源:轉載
供稿:網友

注:如果覺得有問題,可以一起討論哦

 問題:有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;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 长宁县| 宁阳县| 肃北| 博湖县| 米泉市| 射阳县| 红河县| 德钦县| 盖州市| 稻城县| 江门市| 合阳县| 永胜县| 永靖县| 晋江市| 衢州市| 西和县| 阿城市| 皋兰县| 兴山县| 西贡区| 柳州市| 奉化市| 云阳县| 苗栗市| 延长县| 尼木县| 福鼎市| 井研县| 嫩江县| 亳州市| 临海市| 乌恰县| 庐江县| 壶关县| 兰州市| 荃湾区| 秦皇岛市| 光泽县| 洛宁县| 象山县|