Divisoren von 42 sind: 1, 2, 3, 6, 7, 14, 21, 42. Diese quadrierten Teiler sind: 1, 4, 9, 36, 49, 196, 441, 1764. Die Summe der quadrierten Teiler ist 2500, das ist 50 * 50, ein Quadrat!Wie verbessert man diese Lösung?
Gegeben zwei Integer m, n (1 < = m < = n) wir wollen alle ganzen Zahlen zwischen m und n finden, deren Summe der quadrierten Teiler selbst ein Quadrat ist. 42 ist eine solche Nummer.
Das Ergebnis wird ein Array von Arrays sein, jedes Subarray hat zwei Elemente, zuerst die Zahl, deren quadratische Teiler ein Quadrat ist und dann die Summe der quadrierten Divisoren.
Beispiele:
list_squared (1, 250) -> [[1, 1], [42, 2500], [246, 84100]]
list_squared (42, 250), - > [[42, 2500], [246, 84100]]
oben ist der Ausbilder der Frage.
Ich habe ein Problem, wenn die Praxis von Coderwars. mein Code hat alle Tests bestanden, aber habe einen Fehler "Timeout", es bedeutet, dass mein Code nicht sehr gut ist.wie kann ich es verbessern. Unten ist meine Lösung.
from math import sqrt
def get_div(x):
s = []
for i in range(1,x):
if x%i == 0:
# print i, x/i
s.append(i)
s.append(x/i)
return set(s)
def list_squared(m, n):
p = []
for i in range(m,n):
if i == 1:
p.append([1,1])
continue
s = sum(a**2 for a in get_div(i))
if float(sqrt(s)).is_integer():
p.append([i,s])
return p
Versuchen: codereview.stackexchange.com für Ihren Code zu optimieren. – MooingRawr
In 'get_div' müssen Sie nicht nach Zahlen> x/2 suchen, da sie niemals Teiler sein werden. Und afaik müssen Sie nur die Zahlen <= x/4 überprüfen. Und dann sollten Sie kein Set verwenden müssen. – xZise
Ich denke, Sie müssen nur bis zum Quadrat von x in Ihrer Funktion get_div gehen. – Hoopdady