【python练习题】开关电灯

有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.

你可能感兴趣的:(python)