[Python] 백준 알고리즘 PS: 문제출이 2609, 6588 [최대공약수, 최소공배수, 소수]
num = input()
a, b = num.split()
a = int(a)
b = int(b)
# 유클리드 호제법
def gcd(a,b):
if (a>1 and b>1):
num = max(a,b)
div = min(a,b)
while(num%div != 0):
re = num%div
num = div
div = re
else:
div = min(a,b)
return div
# 최대공약수
c = gcd(a,b)
print(c)
# 최소공배수 찾기
print(a*b//c)
이건 최대공약수 최소공배수 구하는 것
마지막에 print(ab/c)는 틀렸는데 print(ab//c)는 맞아서 신기햄
# 4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다.
# step 1) 4보다 큰 짝수 입력 받기
a = int(input())
# 2) 에라토스테네스의 체로 소수 구하기: https://wikidocs.net/21638
n=a
ary = [False,False] + [True]*(n-1)
primes=[]
for i in range(2,n+1):
if ary[i] and ary[i]%2 ==1 : primes.append(i)
for j in range(2*i, n+1, i):
ary[j] = False
# 3) 1을 두 홀수 소수로 나타내기
is_true = False
for i in range(len(primes)):
if a-primes[i] in primes:
print(str(a)+ " = " + str(primes[i]) + " + " + str(a-primes[i]))
is_true = True
break
if is_true==False : print("Goldbach's conjecture is wrong.")
에라토스테네스의 체를 처음 만든 사람은 진짜 천재 아닐까..?
근데 저게 틀려서 다른 코드랑 비교해봤당,,, 아니 왜 틀린거지
def getPrimaryNum_Eratos(N):
nums = [True] * (N + 1)
for i in range(2, len(nums) // 2 + 1):
if nums[i] == True:
for j in range(i+i, N, i):
nums[j] = False
return [[i for i in range(2, N) if nums[i] == True], nums]
primary_nums = getPrimaryNum_Eratos(1000000)[0]
primary_bools = getPrimaryNum_Eratos(1000000)[1]
while(True):
N = int(input())
if N == 0: break
for i in range(N // 2):
if primary_bools[N-primary_nums[i]] == True:
print("{} = {} + {}".format(N, primary_nums[i], N-primary_nums[i])) break
#출처: https://somjang.tistory.com/entry/BaeKJoon-6588번-골드바흐의-추측-문제-풀이 [솜씨좋은장씨]
그러다가 잘못된 점을 깨달았는데,
입력은 하나 또는 그 이상의 테스트 케이스로 이루어져 있다. 테스트 케이스의 개수는 100,000개를 넘지 않는다. 입력의 마지막 줄에는 0이 하나 주어진다.
를 고려하지 않아서 그렇당 히히,,,,
# 4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다.
# 1) 에라토스테네스의 체로 소수 구하기
n=1000000
ary = [False,False] + [True]*(n-1)
primes=[]
for i in range(2,n+1):
if ary[i] and ary[i]%2 ==1 : primes.append(i)
for j in range(2*i, n+1, i):
ary[j] = False
# 2) 수를 입력받기
while(True):
a = int(input())
#is_true = False
if a==0: break
elif (a>4 and a%2 == 0):
count = 0
for i in range(len(primes)):
if a-primes[i] in primes:
print("{} = {} + {}".format(a, primes[i], a-primes[i]))
count += 1
if count>0: break
if count == 0: print("Goldbach's conjecture is wrong.")
그래서 이번엔 이렇게 했더니 시간 초과가 뜨더라고,,, 허허