Side 1 av 1

Finn brøkene

Lagt inn: 04/08-2018 18:17
av LAMBRIDA
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?

Re: Finn brøkene

Lagt inn: 07/08-2018 12:43
av DennisChristensen
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?
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.

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.")
som gir svaret:

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.

Re: Finn brøkene

Lagt inn: 07/08-2018 13:40
av Mattebruker
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 )

Re: Finn brøkene

Lagt inn: 07/08-2018 16:14
av LAMBRIDA
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.

Re: Finn brøkene

Lagt inn: 07/08-2018 16:23
av DennisChristensen
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 )
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.
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.
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.

Re: Finn brøkene

Lagt inn: 08/08-2018 12:18
av DennisChristensen
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.

Re: Finn brøkene

Lagt inn: 08/08-2018 21:56
av LAMBRIDA
Veldig fin løsning.
Da er vel ikke min løsning med den største nevneren lavest mulig, for eg har denne løsningen:
1/2 1/3 1/8 1/10 1/18 1/360