파이썬_실전 프로젝트

프로젝트 오일러 8번문제 - 13자리연속수 곱

q008  https://projecteuler.net/problem=8


The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832.

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?

 

1000자리 숫자에서, 연속하는 13자리숫자들의 곱중에서 가장 큰값을 찾는 문제입니다.

 

plan:
1. 저숫자들을 텍스트 파일로부터 읽어서, 문자열 변수에 저장합니다.
2. 루프문을 만들고 13자리 곱을 계산하고,
3. 조건문으로 큰값을 판별해서 저장하고 다음루프로 넘어갑니다.

 

coding:
먼저 저 숫자를 텍스트 파일로 저장합니다. (q008_data.txt)
그다음 파일에서 1000자리 숫자를 불러오는 코드를 작성합니다.
 

with open('q008_data.txt') as file_object:  #파일 로드.
    lines = file_object.readlines()  #라인단위로 읽어서 저장합니다.
    
pi_string =''       #문자열 변수 초기화
for line in lines:   
    pi_string+= line.rstrip()  #라인에 공백을 제거하면서, 하나의 문자열로 결합.
    


그다음에 메인 루프문을 만듭니다. 루프가 끝나면 마지막에 max 값을 출력해줍니다.
13자리의 숫자의 곱이기 때문에, 1000 개까지 가면 안되고, 끝에서 13번째에서 멈춰야 됩니다.
 

i=0;max_product=0
while i<1000:
    if i+12==999:
        break
print("final max_product :",max_product)


앞서 읽어들인 문자열 변수에서 불러올 숫자는 아래 형식이구요, 1000니깐 0부터 999 번지까지 입니다.
문자열형식이기 때문에, int()를 써서 숫자로 바꿔줘야 합니다. 루프내에서는 [0]을 [i+j]로 바꿔줘야 합니다.

int(pi_string[0])


13자리 곱셈도 루프문으로 돌려서 계산하면 좋을거 같네요.

j=0;product=1    #product 초기값을 0 으로 주면, 곱셈이기 때문에 모든값이 0이 돼버립니다.
while j<13:
    print(pi_string[i+j]+" ",end='')  # 값이 잘나오는지 보기 위해서 print문을 넣어줬습니다.
    product=product*int(pi_string[i+j]) #루프마다 이전값에 누적해서 곱해줍니다.
    j+=1


요걸 전체 루프에다가 다시 넣어줍니다.        
        
 

i=0;max_product=0
while i<1000:
    print("loop",i)
    j=0;product=1
    while j<13:  #13숫자 곱계산하는 부분
        print(pi_string[i+j]+" ",end='')
        product=product*int(pi_string[i+j])
        j+=1
    print("product :",product)
    if product>max_product:  #크기비교해서, 크면 새로운 max값으로 저장
        max_product=product
        print("new max_product :",max_product)
    if i+12==999:  #끝에서 12번째가 되면 종료
        break
    i+=1
print("final max_product :",max_product)

 

댓글

댓글 본문
작성자
비밀번호
버전 관리
노마드
현재 버전
선택 버전
graphittie 자세히 보기