Reciprocal cycles : Problem 26 : Project Euler
A unit fraction contains 1 in the numerator. The decimal
representation of the unit fractions with denominators 2 to 10 are
given:
Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.
Answer:
Max Length= 985 for Decimal Expansion of 1/ 983 = .001017293997965412004069175991861648016276703967446592065106815869
786368260427263479145473041709053916581892166836215666327568667344
862665310274669379450661241098677517802644964394710071210579857578
840284842319430315361139369277721261444557477110885045778229908443
540183112919633774160732451678535096642929806714140386571719226856
561546286876907426246185147507629704984740590030518819938962360122
075279755849440488301119023397761953204476093591047812817904374364
191251271617497456765005086469989827060020345879959308240081383519
837232960325534079348931841302136317395727365208545269582909460834
181078331637843336724313326551373346897253306205493387589013224821
973550356052899287894201424211597151576805696846388606307222787385
554425228891149542217700915564598168870803662258392675483214649033
570701932858596134282807731434384537131230925737538148524923702950
152594099694811800610376398779247202441505595116988809766022380467
955239064089521871820956256358087487283825025432349949135300
To solve this problem we have to perform the paper-pencil method of division instead of using inbuilt method of (float) division. Since the divisor if maximum of 3 digits (999) makes the case more easier. Only thing to make note of when to stop the division process, which is best understood upon dividing few examples manually. Try with 1/3, 1/7, 1/8 1/133..... In short a pattern will reappear iff in the process of division by n, let diviList be the collection of of the dividend till the mth step, at the (m+1)th step if the dividend is in diviList, you are done, break!
Python Code
def reciprocalCycles():
maxLength = 0
maxN = 0
n = 2
while n < 1000:
dividend = 1
divisor = n
quotient = "."
diviList = ()
diviList = diviList + (dividend,)
while True:
if dividend < divisor:
dividend = dividend*10
if dividend < divisor:
dividend = dividend*10
quotient = quotient + "0"
if dividend < divisor:
dividend = dividend*10
quotient = quotient + "0"
if dividend not in diviList:
diviList = diviList + (dividend,)
else:
break
temp = dividend
dividend = (dividend - (dividend/divisor)*divisor)
quotient = quotient+str(temp/divisor)
if maxLength <= len(quotient):
maxLength = len(quotient)
maxN = n
q = quotient
n = n + 1
print "Max Length=",maxLength," for Decimal Expansion of 1/",maxN,"=",q
reciprocalCycles()
Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.
1/2 = 0.5 1/3 = 0.(3) 1/4 = 0.25 1/5 = 0.2 1/6 = 0.1(6) 1/7 = 0.(142857) 1/8 = 0.125 1/9 = 0.(1) 1/10 = 0.1
Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.
Answer:
Max Length= 985 for Decimal Expansion of 1/ 983 = .001017293997965412004069175991861648016276703967446592065106815869
786368260427263479145473041709053916581892166836215666327568667344
862665310274669379450661241098677517802644964394710071210579857578
840284842319430315361139369277721261444557477110885045778229908443
540183112919633774160732451678535096642929806714140386571719226856
561546286876907426246185147507629704984740590030518819938962360122
075279755849440488301119023397761953204476093591047812817904374364
191251271617497456765005086469989827060020345879959308240081383519
837232960325534079348931841302136317395727365208545269582909460834
181078331637843336724313326551373346897253306205493387589013224821
973550356052899287894201424211597151576805696846388606307222787385
554425228891149542217700915564598168870803662258392675483214649033
570701932858596134282807731434384537131230925737538148524923702950
152594099694811800610376398779247202441505595116988809766022380467
955239064089521871820956256358087487283825025432349949135300
To solve this problem we have to perform the paper-pencil method of division instead of using inbuilt method of (float) division. Since the divisor if maximum of 3 digits (999) makes the case more easier. Only thing to make note of when to stop the division process, which is best understood upon dividing few examples manually. Try with 1/3, 1/7, 1/8 1/133..... In short a pattern will reappear iff in the process of division by n, let diviList be the collection of of the dividend till the mth step, at the (m+1)th step if the dividend is in diviList, you are done, break!
Python Code
def reciprocalCycles():
maxLength = 0
maxN = 0
n = 2
while n < 1000:
dividend = 1
divisor = n
quotient = "."
diviList = ()
diviList = diviList + (dividend,)
while True:
if dividend < divisor:
dividend = dividend*10
if dividend < divisor:
dividend = dividend*10
quotient = quotient + "0"
if dividend < divisor:
dividend = dividend*10
quotient = quotient + "0"
if dividend not in diviList:
diviList = diviList + (dividend,)
else:
break
temp = dividend
dividend = (dividend - (dividend/divisor)*divisor)
quotient = quotient+str(temp/divisor)
if maxLength <= len(quotient):
maxLength = len(quotient)
maxN = n
q = quotient
n = n + 1
print "Max Length=",maxLength," for Decimal Expansion of 1/",maxN,"=",q
reciprocalCycles()
No comments:
Post a Comment