有1到100号的灯,一开始全部点亮。每盏灯都有独立的开关,且开关只有“开”和“关”两种状态。
第一次把所有1的倍数灯的开关按一次,第二次把所有2的倍数灯的开关按一下,一直到第一百次把所有100的倍数灯的开关按一下。
问,此时还有多少灯灭着?
一、Java编程解决
package test;
import java.util.ArrayList;
import java.util.List;
public class lamp1_100 {
public static void main(String[] args){
int count=0;
List<Integer> dd = new ArrayList<Integer>();
// 默认所有的灯开着
for(int i=0;i<100;i++){
dd.add(1);
}
// 操作所有的灯
for(int k=1;k<=100;k++){
//对k的倍数的灯进行操作如果是关设置成开 如果是开设置成关
for(int t=1;t<=100/k;t++){
if(dd.get((k*t)-1)==0){
dd.set((k*t)-1,1);
}else{
dd.set((k*t)-1,0);
}
}
}
// 计算灭灯的灯的个数
for(int i=0;i<100;i++){
if(dd.get(i)==0){
count++;
System.out.println("剩余灭的灯的索引:"+ i);
}
}
System.out.println("剩余灭的灯的个数:"+count);
}
}
二、python字典解决
灯泡有两种状态:开和关,用 -1代表关,用1代表开。每次操作后,状态上乘以-1。
on ---> 1 off ---> -1
dic = {k:1 for k in range(1,101)}
def lanm(n):
for i in range(1,n+1):
for x in dic:
if x%i == 0:
dic[x] = int(dic[x])*-1
return dic
num = len({k: v for k,v in lanm(100).items() if v == 1})
print(f"There are {num} lights on.")
#There are 10 lights on.
三、python列表
lamp = []
#默认100盏灯都是开的
for i in range(100):
lamp.append(1)
#循环100个灯
for k in range(1,101):
i = 0
#对k的倍数的灯进行开关操作
while i <= 100/k:
if lamp[(i*k)-1] == 0:
lamp[(i * k) - 1] = 1
else:
lamp[(i*k)-1]=0
i += 1
#count = len([i for i in lamp if i==0])
count = 0
for i in range(0,100):
if lamp[i] == 0:
count +=1
print(f"灭灯的位置{i+1}")
print(f"灭灯的数量{count}")