c++ 实现点灯程序

算法数据结构习题1

训练1-38: 现在有n 盏灯,编号为1~n ,开始时所有的灯都是关
的,编号为1的人走过来,把编号是1的倍数的灯开关按下(开的关上,
关的打开),编号为2的人把编号是2的倍数的灯开关按下,编号为3的
人又把编号是3的倍数的灯开关按下……直到第k 个人为止。
给定n 和k (0<n ,k ≤1000),输出哪几盏灯是开着的。

题目分析:
灯的序号是1到n;人的序号是1到k,
解题思路:第一个人到第一个灯前去判断灯的序号是自己序号的倍数如果是就反转灯的状态然后去下一个灯去判断,,,直到最后一个灯为止。
第二个人开始同样的操作走到第一个灯的前面去比较灯的序号是不是自己序号的倍数是把灯的状态反转,然后下一个灯,,,,知道最后一个灯为止
第三个人同样,,,,直到最后一个人也完成所有的灯的判断。
最后输出灯的状态。

灯的状态因为只有亮和灭两种状态所以 灯类型是 bool 真假对应亮和灭
每个人都要去关闭灯所以第一个循环就是人从1开始到k;
每个人都要去到100个灯的面前所以又一个内层循环1到n;
然后思考人的序号和灯的序号之间的关系 i代表的是人的序号j代表的是灯的序号
#include <iostream>
using namespace std;
const int n = 1000;		//灯的个数1000
const int k = 10;		//人的个数
void main(){
	
	bool lamp[n+1] = { false };	//把所有的灯全部关掉
	for (int i = 1; i <= k; i++){//人的号
	//	n%i	//要关灯的好
		for (int j=1; j <= n; j++){
			if (j%i == 0){	//灯号除以人的序号等于0按下灯的开关 
				lamp[j] = !lamp[j];
			}			
		}
	}	
	int flag=0;//记录灯灭的数量
	for (int i = 0; i <= n; i++){
		if (lamp[i]){
			cout << " ";
			flag++;
		}
		else
			cout << "-";	
	}
	cout << endl;
	cout << flag << endl;//灯亮的个数
	system("pause");
}

总结: 就是把问题转抽象成计算机程序,想出对应的步骤,最后用程序表达

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值