(以前写的东西,现在搬上来,现在变笨了,何解?/(ㄒoㄒ)/~~)
同学在朋友圈分享了一个问题,我试着写了下。
问题:
150盏亮着的电灯,各有一个拉线开关控制,编号为1~150
将编号为1~150倍数的灯,依次拉一下
问:拉完后亮着的灯数为几盏?
哪盏灯被拉的最多?”
第一种:
var lightBox = [];
//初始化数组 偶数亮着,奇数熄灭
for(var i = 0 ; i <= 150; i++){
lightBox[i] = 1; //都是1的倍数,所以是熄灭的
}
//开始拉灯
for(var i = 2; i <= 150; i++){
for(var j = 2; j <= 150; j++){
if(j%i == 0){
lightBox[j] += 1;
}
}
}
var openNum = 0;
var switchMaxIndex = 1;
var switchMaxNum = lightBox[1];
for(var i = 1; i <= 150; i++){
if(lightBox[i]%2 == 0){
openNum ++;
}
if(lightBox[i] > switchMaxNum){
switchMaxNum = lightBox[i]; //最大开灯次数
switchMaxIndex = i; //记录最大拉灯数的下标
}
}
console.log(lightBox);
console.log("亮灯数为:",lightBox);
console.log("拉的最多次的灯为:" + switchMaxIndex + "号;最大开灯次数为:" + switchMaxNum);
//结果:
//亮灯数为: 138
//拉的最多次的灯为:120号;最大开灯次数为:16
第二种
思路:算公约数的个数。
//求一个数的公约数的个数
function countApproximate(num){
var count = 0;
for(var i = 1; i <= (num/2); i ++){
if(num%i == 0){ //是因数
count ++;
}
}
return count + 1; //加上它自己
}
//偶数点亮,奇数熄灭
var lightBox = [];
for(var i = 1; i <= 150; i++){
lightBox[i] = countApproximate(i); //拉灯次数
}
//console.log(lightBox);
var openLightNum = 0;
var openMaxNo = 1;
var openMaxNum = lightBox[1];
for(var i = 1; i <= 150; i++){
if(lightBox[i]%2 == 0){
openLightNum ++;
}
if(lightBox[i] > openMaxNum){
openMaxNum = lightBox[i];
openMaxNo = i;
}
}
console.log("点亮的灯的个数为" + openLightNum);
console.log(`被开最多次的是${openMaxNo}号盏灯。被拉了${openMaxNum}次`);
//结果:
//点亮的灯的个数为138
//被开最多次的是120号盏灯。被拉了16次