Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2018-08-28, 03:41
  #1
Medlem
Mulle-Meths avatar
Hej!

Jag börjar med att förklara vad jag försöker åstadkomma, så kommer det således vara lättare att hjälpa mig

Säg att jag har talet 24. Talet har flera faktorer, och om vi faktorerar talet så får vi följande tal:

1, 2, 3, 4, 6, 8, 12

Bortsett från de första två faktorerna, så är inga övriga faktorer primtal. Om vi istället faktorerar talet 49 så får vi två faktorer, 1 och 7. 7 är ett primtal.

Det jag vill göra är helt enkelt att primtalsfaktorisera tal med hjälp av PHP.

En funktion som faktoriserar ett tal:

Kod:
<?php

$myNumber 
49;
$factors = array();

function 
factorize($myNumber$factors) {
    
    for(
$i 1$i $myNumber$i++) {
        
        if(
$myNumber $i == 0) {
            
array_push($factors$i);
        }
    }

    
print_r($factors);
}

factorize($myNumber$factors);

?>

Sedan vill jag ju även se om faktorerna är primtal. Här vi har vi en funktion som tar reda på detta:

Kod:
<?php

$myNumber 
13;
$flag True;

function 
isPrime($myNumber$flag) {

    for(
$i 2$i $myNumber$i++) {
        
        if(
$myNumber $i == 0) {
            
$flag False;
        }
    }
}

isPrime($myNumber$flag);

if(
$flag == True) {
    echo 
'The number IS a prime!';
}

else {
    echo 
'The number is NOT a prime!';
}

?>

Det jag har problem med är att kombinera dessa. Mitt försök bygger på att jag skippar att skriva en funktion som tar reda på primtal, för att istället göra det i en foreach-loop som utför koden på varje array-item, vilket borde vara varje faktor av talet $myNumber.

Kod:
<?php

$myNumber 
49;
$factors = array();
$primeFactors = array();

function 
factorize($myNumber$factors) {

    for(
$i 1$i $myNumber$i++) {
    
        if(
$myNumber $i == 0) {
            
array_push($factors$i);
        }
    }
}

factorize($myNumber$factors);

// Det är här jag kör fast!

?>

Det jag vill göra är alltså att jag vill loopa igenom array:en som innehåller faktorer, och för varje faktor ta reda på om det talet är ett primtal eller inte, och sedan fortsätta vidare till nästa faktor. Varje primtalsfaktor ska pushas in i en array. Hur gör jag detta på bästa sätt?

Funderade på om man kunde ha en for-loop inuti en foreach-loop. For-loopen är alltså koden som kollar om talet är ett primtal eller inte.

Mvh, Mulle-Meth
Citera
2018-08-28, 04:16
  #2
Medlem
Din primtalstestare funkade inget vidare när jag testade (testa med 29 och 30). Här får du en modiferad variant:

Kod:
<?php
    
function isPrime($myNumber)
    {
        for (
$i 2$i $myNumber$i++)
            if (
$myNumber $i == 0)
                return 
FALSE;

        return 
TRUE;
    }

    
$myNumber 29;

    if (
isPrime($myNumber))
        echo 
'The number IS a prime!';
    else
        echo 
'The number is NOT a prime!';
?>
Citera
2018-08-28, 06:49
  #3
Medlem
Mia-Rovys avatar
Jag har en generell regel som kommer att göra dig till en mycket bättre programmerare:

Om man har skapat en funktion som inte returnerar något så har man förmodligen gjort något allvarligt fel eller så kommer du att få problem när ditt system växer.

Och undvik att i högsta möjliga mån modifiera saker från omvärlden i dina funktioner
__________________
Senast redigerad av Mia-Rovy 2018-08-28 kl. 07:12.
Citera
2018-08-28, 09:56
  #4
Medlem
Mulle-Meths avatar
Citat:
Ursprungligen postat av LoveShy
Din primtalstestare funkade inget vidare när jag testade (testa med 29 och 30). Här får du en modiferad variant:

Kod:
<?php
    
function isPrime($myNumber)
    {
        for (
$i 2$i $myNumber$i++)
            if (
$myNumber $i == 0)
                return 
FALSE;

        return 
TRUE;
    }

    
$myNumber 29;

    if (
isPrime($myNumber))
        echo 
'The number IS a prime!';
    else
        echo 
'The number is NOT a prime!';
?>

Tack! Jag har åtminstone lyckats faktorisera ett tal korrekt. Det jag skulle vilja ha som argument för funktionen isPrime() är min array med faktorer, men jag vet inte riktigt hur jag ska skriva in det korrekt. Bör jag ha en foreach-loop som genererar varje array-index som sedan används som argument i primtalsfunktionen?
Citera
2018-08-28, 10:06
  #5
Medlem
Citat:
Ursprungligen postat av Mulle-Meth
Tack! Jag har åtminstone lyckats faktorisera ett tal korrekt. Det jag skulle vilja ha som argument för funktionen isPrime() är min array med faktorer, men jag vet inte riktigt hur jag ska skriva in det korrekt. Bör jag ha en foreach-loop som genererar varje array-index som sedan används som argument i primtalsfunktionen?

Jag kom inte så långt, ska titta lite mer sen. Är lite osäker på exakt hur du vill ha det. Men om du kör en faktorisering först och sedan returnerar samtliga faktorer som en array och sedan kör du primtalstestaren på samtliga i arrayen så får du två listor. En för faktorerna för testat tal och en med vilka av dem som var primtal. Är det det som är tanken?

Jag har aldrig gjort på detta sättet själv, eftersom alla tal antingen är primtal och därmed saknar faktorer eller så har de två primtal som faktorer.
__________________
Senast redigerad av LoveShy 2018-08-28 kl. 10:19.
Citera
2018-08-28, 10:13
  #6
Medlem
Citat:
Ursprungligen postat av Mia-Rovy
Jag har en generell regel som kommer att göra dig till en mycket bättre programmerare:

Om man har skapat en funktion som inte returnerar något så har man förmodligen gjort något allvarligt fel eller så kommer du att få problem när ditt system växer.

Och undvik att i högsta möjliga mån modifiera saker från omvärlden i dina funktioner

Håller helt med.

Hans funktion kan dock inte modifiera något globalt alls, även om det var tanken. För att göra det så måste man antingen skicka med en pekare till det som ska modifeiras eller använda nyckelordet global följt av variabelnamnet inne i funktionen. Naturligtvis finns det undantag till detta också.
__________________
Senast redigerad av LoveShy 2018-08-28 kl. 10:15.
Citera
2018-08-28, 13:32
  #7
Medlem
Om du faktoriserar 49 vill du få ut 7 och 7 inte 1 och 7.

Rimligt är att först testa om loopvariabeln är ett primtal innan du testar om den är en faktor. När du hittar en primtalsfaktor så dividerar du ner ditt ursprungliga tal med den och startar loopen från början. Det kan vara lämpligt att skriva en boolsk funktion isFactor(mynumber,prime).
Citera
2018-08-28, 15:34
  #8
Medlem
Mulle-Meths avatar
Citat:
Ursprungligen postat av LoveShy
Jag kom inte så långt, ska titta lite mer sen. Är lite osäker på exakt hur du vill ha det. Men om du kör en faktorisering först och sedan returnerar samtliga faktorer som en array och sedan kör du primtalstestaren på samtliga i arrayen så får du två listor. En för faktorerna för testat tal och en med vilka av dem som var primtal. Är det det som är tanken?

Jag har aldrig gjort på detta sättet själv, eftersom alla tal antingen är primtal och därmed saknar faktorer eller så har de två primtal som faktorer.

Jag var nog lite otydlig, men det jag egentligen vill åstadkomma är att primtalsfaktorisera ett givet tal med PHP. Eftersom att det lätt blir grötigt för en nybörjare som mig att skriva all kod i ett svep, så har jag delat upp övningen i delmoment. Dessa är alltså att först faktorisera ett tal, för att sedan ta reda på vilka faktorer som är primtal, det vill säga primtalsfaktorer

Tack för dina svar!
Citera
2018-08-28, 15:36
  #9
Medlem
Mulle-Meths avatar
Citat:
Ursprungligen postat av Katalysator
Om du faktoriserar 49 vill du få ut 7 och 7 inte 1 och 7.

Rimligt är att först testa om loopvariabeln är ett primtal innan du testar om den är en faktor. När du hittar en primtalsfaktor så dividerar du ner ditt ursprungliga tal med den och startar loopen från början. Det kan vara lämpligt att skriva en boolsk funktion isFactor(mynumber,prime).

Oj, du har nog rätt. Har blivit blind av programmeringstänket och helt missat de matematiska begreppen...
Citera
2018-08-28, 23:33
  #10
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av Mulle-Meth
Oj, du har nog rätt. Har blivit blind av programmeringstänket och helt missat de matematiska begreppen...
Du kan ju börja med att skriva och rita upp algoritmen på vanlig svenska. Till en början kan du utgå från att det finns en funktion som talar om huruvida ett tal är primtal och en annan som talar om huruvida ett tal är en faktor till ett annat. Senare måste du givetvis implementera de funktionerna. Sedan formaliserar du algoritmen mer och mer och till slut kan du direktöversatta till ex PHP.
Citera
2018-09-04, 19:32
  #11
Medlem
Mulle-Meths avatar
Citat:
Ursprungligen postat av Neksnor
Du kan ju börja med att skriva och rita upp algoritmen på vanlig svenska. Till en början kan du utgå från att det finns en funktion som talar om huruvida ett tal är primtal och en annan som talar om huruvida ett tal är en faktor till ett annat. Senare måste du givetvis implementera de funktionerna. Sedan formaliserar du algoritmen mer och mer och till slut kan du direktöversatta till ex PHP.

Tack! Detta är lite av vad jag siktat på. Jag behöver alltså dels ta reda på om ett tal är ett primtal eller inte, samt så måste jag kunna faktorera ett tal.

När jag sedan har faktorerna i en array så vill jag kunna använda funktionen som tar reda på om ett tal är ett primtal eller inte på samtliga faktorer. Problemet är att jag inte vet hur man gör detta, men jag ska söka. Samt så tror jag att mitt faktoriseringsscript är buggigt...
Citera
2018-09-04, 19:54
  #12
Medlem
Mulle-Meths avatar
Citat:
Ursprungligen postat av LoveShy
Din primtalstestare funkade inget vidare när jag testade (testa med 29 och 30). Här får du en modiferad variant:

Kod:
<?php
    
function isPrime($myNumber)
    {
        for (
$i 2$i $myNumber$i++)
            if (
$myNumber $i == 0)
                return 
FALSE;

        return 
TRUE;
    }

    
$myNumber 29;

    if (
isPrime($myNumber))
        echo 
'The number IS a prime!';
    else
        echo 
'The number is NOT a prime!';
?>

Jag testade din kod, men den säger att 49 är ett primtal, vilket det inte är :/

Ser du något/några fel i detta?

Kod:
<?php

$myNumber 
49;

function 
isPrime($myNumber) {

    for(
$i 2$i $myNumber$i++) {

        if(
$myNumber $i == 0) {
            return 
False;
        }

        else {
            return 
True;
        }
    }
}

isPrime($myNumber);

if(
isPrime($myNumber)) {
    echo 
'YES!';
}

else {
    echo 
'NO!';
}

?>

Jag brukar skriva koden själv som folk ger mig, lär mig bättre då :P
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback