[codeup] 2055. 2つの数の約数を求めます


質問する


2つの整数a,bの約数を出力するプログラムを作成してください.

入力


2つの整数a,bを入力します.(1 <= a <= b <= 1,000,000,000)

しゅつりょく


2つの整数a,bの約数は昇順に出力される.
△重複した薬液は1回のみ出力される.

入力例


6 14

出力例


1 2 3 6 7 14

実行コード


このコードを初めて作成する場合、テスト入出力に特別な事項がないため、答えを提出しましたが、タイムアウトしました.
a,b = map(int,input().split(" "))

def get_divisor(number):
    numbers = []
    for i in range(1,number+1):
        if number % i == 0:
            numbers.append(i)
    return numbers

def delete_duplication(a,b):
    result = []
    result = get_divisor(a) + get_divisor(b)
    result = list(set(result))
    result.sort()       
    return result
    
temp = delete_duplication(a,b)
print(' '.join(map(str,temp)))
タイムアウトの問題は、毎日のクエリの部分によって発生する可能性がありますが、これは私の知っている知識ラインでどのように解決しますか?
薬水を探す様々な方法の中で、より速く薬水を見つける方法が見つかった.
ヒントは「平方根」
「すべての合成数は、その平方根以下です.」
ある大きな数を分解する場合、その平方根で除算する必要はありません.
この部分は時間短縮の大きな手がかりとなっている.
例えば、8のミネラルウォーターを探すとしたら、
8=[1,2,4,8]
i*iは8を超える
1 X 1 = 1
2 X 2=4:ここまで計算します.
3 X 3 = 9
すなわち,iは1,2になり,n/iは8,4になる.
これにより4つの薬水を得ることが可能となった.
これをコードに適用します.
import math

a,b = map(int,input().split(" "))

def get_divisor(number):
    num = 0
    num = math.sqrt(number)
    numbers = []
    for i in range(1,int(num)+1):
        if number % i == 0:
            numbers.append(i)
            numbers.append(number//i)
    return numbers

def delete_duplication(a,b):
    result = []
    result = get_divisor(a) + get_divisor(b)
    result = list(set(result))
    result.sort()       
    return result
    
temp = delete_duplication(a,b)
print(' '.join(map(str,temp)))
あまり変わっていませんが、def get divisorセクションにnumという変数を追加し、numberの平方根を加えて、その範囲の値を求めて除算します.
このようにして行って、薬水のタイムアウトを求めて解決します!!