算法题:150盏亮着的电灯,各有一个拉线开关控制,编号为1~150 将编号为1~150倍数的灯,依次拉一下 问:拉完后亮着的灯数为几盏? 哪盏灯被拉的最多?

(以前写的东西,现在搬上来,现在变笨了,何解?/(ㄒ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次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值