算法数据结构习题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");
}
总结: 就是把问题转抽象成计算机程序,想出对应的步骤,最后用程序表达