Eg vil komme med ei oppgave som eg tror noen vil ha glede av å prøve seg på, men eg veit ikke hvor vanskelig den er.
Oppgaven
Finn seks forskjellige brøker med teller 1 og den største nevneren lavest mulig. Når hver brøk multipliseres med 60, så vil tre av de seks produktene være heltallige og summen av de seks produktene 67.
Hvilke seks brøker kan dette være?
Finn brøkene
Moderatorer: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa
-
- Grothendieck
- Innlegg: 826
- Registrert: 09/02-2015 23:28
- Sted: Oslo
Fin øving i programmering (Python) for meg dette her. Jeg er ganske uerfaren, så vennligst ikke mobb dersom koden ser elendig ut. Dersom noen har kommentarer om hvordan den kan effektiviseres ytterligere, tas det gjerne imot! Jeg tolker oppgaven dithen at vi ønsker at minst 3 av produktene skal være heltall.LAMBRIDA skrev:Eg vil komme med ei oppgave som eg tror noen vil ha glede av å prøve seg på, men eg veit ikke hvor vanskelig den er.
Oppgaven
Finn seks forskjellige brøker med teller 1 og den største nevneren lavest mulig. Når hver brøk multipliseres med 60, så vil tre av de seks produktene være heltallige og summen av de seks produktene 67.
Hvilke seks brøker kan dette være?
Kode: Velg alt
import math
import time
start = time.time()
[a,b,c,d,e,f] = [1]*6
k=1
førsteløsning = False
svar1 = []
svar = []
m=0
while k>0:
if 60*(1/a + 1/b + 1/c + 1/d + 1/e + 1/f) == 67: # Sjekker betingelser
counter = 0
for i in [a,b,c,d,e,f]: # Neste betingelse
if 60/i == math.floor(60/i):
counter += 1
if counter >= 3 and len([a,b,c,d,e,f]) == len(set([a,b,c,d,e,f])): # Siste betingelser
svar1 = [a,b,c,d,e,f]
if førsteløsning == False:
m = max(svar1)
svar = svar1
førsteløsning = True
if max(svar1) < m:
m = max(svar1) # Ta kun vare på minste maksverdi funnet
svar = svar1
if førsteløsning == True and a > m: # Dersom a>m vil vi kun finne større maksverdier senere
break
f += 1 # Tell oppover
if f == 10*k:
f = 1
e += 1
if e == 10*k:
[e, f] = [1] * 2
d += 1
if d == 10*k:
[d, e, f] = [1] * 3
c += 1
if c == 10*k:
[c, d, e, f] = [1] * 4
b += 1
if b == 10*k:
[b, c, d, e, f] = [1]*5
a += 1
if a == 10*k:
k += 1
elapsed = (time.time() - start)
print("Den ønskede løsningen er 1/" + str(svar[0]) + ", 1/" + str(svar[1]) + ", 1/" + str(svar[2]) + ", 1/" + str(svar[3]) + ", 1/" + str(svar[4]) + " og " + "1/" + str(svar[5]) + ", funnet på " + str(elapsed) + " sekunder.")
Kode: Velg alt
Den ønskede løsningen er 1/10, 1/2, 1/5, 1/6, 1/12 og 1/15, funnet på 46.237741231918335 sekunder.
Viser til oppgaven. Sitat: " Finn seks forskjellige brøker med nevner lik 1 ".
Løysinga til D. C . ( førre innlegg ) oppfyller ikkje dette kravet ( gitt at eg har tolka
oppgåva rett )
Løysinga til D. C . ( førre innlegg ) oppfyller ikkje dette kravet ( gitt at eg har tolka
oppgåva rett )
-
- Grothendieck
- Innlegg: 826
- Registrert: 09/02-2015 23:28
- Sted: Oslo
Herregud, så sløvt av meg å overse dette. Jeg har rettet opp koden min nå. Nå tar programmet selvsagt mye lenger tid, ettersom det finnes færre slike løsninger. Mye av tiden går riktignok til å sjekke betingelsen $a > m$, som ikke trengs for å finne en hvilken som helst løsning, men ettersom vi ønsker å finne løsningen med minste maksverdi av nevnere, må en sjekk som dette være med.Mattegjest skrev:Viser til oppgaven. Sitat: " Finn seks forskjellige brøker med nevner lik 1 ".
Løysinga til D. C . ( førre innlegg ) oppfyller ikkje dette kravet ( gitt at eg har tolka
oppgåva rett )
Poenget mitt er bare at vi trolig ikke insisterer på at nøyaktig tre av produktene skal være heltallige. Det går også fint om 4, 5 eller alle 6 er det.LAMBRIDA skrev:Viss for eksempel 0,333333333333 multipliser med 60, og produktet ikke er et helt tall. Da må eg beklage at bare to av de seks produktene er heltallige.
-
- Grothendieck
- Innlegg: 826
- Registrert: 09/02-2015 23:28
- Sted: Oslo
Kan legge til at dersom vi ønsker løsningen med minste maksverdi for teller, hvor nøyaktig tre av produktene er heltallige, kan vi endre betingelsen $\texttt{if counter >= 3}$ om til $\texttt{if counter == 3}$ i linje 16. Da får vi følgende svar:
Kode: Velg alt
Den ønskede løsningen er 1/28, 1/2, 1/5, 1/6, 1/7 og 1/14, funnet på 448.02368211746216 sekunder.