有N个灯放在一起,从1到N依次顺序编号,有N个人也从1到N依次编号。1号将灯全部熄灭,2号将,凡是2的倍数的灯打开;3号将凡是3的倍数的灯作相反处理(该灯如为打开,则将他关闭;如果关闭,则将它打开)。以后的人都和3号一样,将凡是自己编号倍数的灯作相反处理。
编程实现:第N个人操作后,按顺序输出等的状态(1表示灯打开,0表示灯熄灭)。
输入
输入:N(1<= N <= 2000000),灯的个数
输出
输出:灯的状态,用01序列表示,中间无空格。
输入示例:
2
输出示例:
01
代码实现:
__author__ = 'c08762'
# -*- coding:utf-8 -*-
def is_valid(numb):
"""输入合法性检查,必须输入正数,不支持科学计数法"""
try:
int(numb)
except:
return False
else:
if int(numb) < 1 or int(numb) > 2000000:
return False
else:
return True
# 接收一个数,并进行合法性检查,范围检查非必须,n可为任意正整数
num_t = input("Pls enter a number between 1 and 2000000:\n")
while not is_valid(num_t):
num_t = input("That's not a valid number. Try again:\n")
num = int(num_t)
# 使用正负号表示灯的状态
lights = list(range(1, num+1))
for i in range(1, num+1):
for j in range(i-1, num, i):
lights[j] = - lights[j]
# 按题意转化为0,1表示状态
for k in range(len(lights)):
if lights[k] > 0:
print(1, end='')
else:
print(0, end='')
# 灯的状态存储在列表中
# print(lights)
# for k in range(len(lights)):
# if lights[k] > 0:
# lights[k] = 1
# else:
# lights[k] = 0
# print(lights)
# for i in lights:
# print(i, end='')
# print('\nThere are(is) %d light(s) off.' % lights.count(0))
效果:
Pls enter a number between 1 and 2000000:
10
0110111101
效果2:
Pls enter a number between 1 and 2000000:
10
[-1, 2, 3, -4, 5, 6, 7, 8, -9, 10]
[0, 1, 1, 0, 1, 1, 1, 1, 0, 1]
0110111101
There are(is) 3 light(s) off.