有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) < or int(numb) > :
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(, num+))
for i in range(, num+):
for j in range(i-, num, i):
lights[j] = - lights[j]
# 按題意轉化為0,1表示狀态
for k in range(len(lights)):
if lights[k] > :
print(, end='')
else:
print(, 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.