Springen naar inhoud

Alle delers van een bepaald getal bepalen


  • Log in om te kunnen reageren

#1

Raul

    Raul


  • >100 berichten
  • 159 berichten
  • Ervaren gebruiker

Geplaatst op 09 augustus 2008 - 16:43

Hallo ieder

Wij willen alle delers van het getal 561 bepalen.. hoe zou jij dit oplossen?

1 en 561 gemakkelijk te vinden want elk getal is deelbaar door zichzelf en het getal 1.

Ga je gewoon de lijn volgen en dan door 2,3,4,5,6,... delen en de delers bewaren of doe je het anders?

Hoe zou je dit probleem met computer kunnen oplossen?

Ik zou zo iets schrijven en corrigeer me aub indien ik ergens verkeerd ga



[codebox] int a = 1;
int teller = 1;

scanf("%d",&a);
do{
if (a%teller == 0){
printf("%d ",(a/teller));
}
teller++;
} while (a >= teller);[/codebox]


Groetjes
Doe niet jouw best om te leven, maar doe uw best om het leven een zin te geven.! (mijn eigen overtuiging)

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 09 augustus 2008 - 18:25

Wij willen alle delers van het getal 561 bepalen.. hoe zou jij dit oplossen?


Haskell:
[x | x<-[1..561], 561 `mod` x == 0]

Ik zou zo iets schrijven en corrigeer me aub indien ik ergens verkeerd ga

for-lusje ligt veel meer voor de hand i.p.v. een do..while (vind ik).

#3

Pr.Prlwytskovsky

    Pr.Prlwytskovsky


  • >25 berichten
  • 38 berichten
  • Gebruiker

Geplaatst op 09 augustus 2008 - 18:55

Ik denk dat als je over de helft bent je wel kunt stoppen met zoeken.

#4

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 09 augustus 2008 - 19:11

Ik denk dat als je over de helft bent je wel kunt stoppen met zoeken.

Weet ik wel zeker. :D

#5

Raul

    Raul


  • >100 berichten
  • 159 berichten
  • Ervaren gebruiker

Geplaatst op 09 augustus 2008 - 19:14

Haskell:

[x | x<-[1..561], 561 `mod` x == 0]


for-lusje ligt veel meer voor de hand i.p.v. een do..while (vind ik).


ja :D
dus gewoon zoeken ?

ja, for-lusje ligt veel meer voor de hand maar de body van do while wordt altijd min 1 keer uitgevoerd! toch?

dank u


Ik denk dat als je over de helft bent je wel kunt stoppen met zoeken.


zo is het gemakkelijk maar niet gebruikelijk en niet mogelijk

als je niet alle delers van x kent dan weet je ook nooit of je de helft bereikt :P
Doe niet jouw best om te leven, maar doe uw best om het leven een zin te geven.! (mijn eigen overtuiging)

#6

Pr.Prlwytskovsky

    Pr.Prlwytskovsky


  • >25 berichten
  • 38 berichten
  • Gebruiker

Geplaatst op 09 augustus 2008 - 19:36

int helft = 0;    
scanf("%d",&a);
helft = a/2;

do{
if (a%teller == 0){
printf("%d ",(a/teller));
}
teller++;
} while (helft >= teller); _linenums:0'>int a = 1; int teller = 1; <strong class='bbc'>int helft = 0;</strong> scanf("%d",&a); <strong class='bbc'>helft = a/2;</strong> do{ if (a%teller == 0){ printf("%d ",(a/teller)); } teller++; } while (<strong class='bbc'>helft</strong> >= teller);

Als het niet gebruikelijk is moet je het zeker niet doen ... maar mogelijk is het wel hoor, en 2x zo rap.

#7

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 09 augustus 2008 - 19:46

als je niet alle delers van x kent dan weet je ook nooit of je de helft bereikt :D

Je hebt de verkeerde helft voor ogen... het gaat om de helft van x (niet de helft van het aantal delers).

#8

Raul

    Raul


  • >100 berichten
  • 159 berichten
  • Ervaren gebruiker

Geplaatst op 09 augustus 2008 - 20:10

Ik heb jullie verkeerd begrepen, ik dacht de helft van aantal delers van x en niet helft van x !!

Mijn excuses

Dank jullie

Veranderd door Raul, 09 augustus 2008 - 20:11

Doe niet jouw best om te leven, maar doe uw best om het leven een zin te geven.! (mijn eigen overtuiging)

#9

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 10 augustus 2008 - 11:52

Ik denk dat als je over de helft bent je wel kunt stoppen met zoeken.

Het kan nog een stuk eerder, je hoeft slechts tot de wortel van x te zoeken.

Wel bij iedere gevonden deler beide factoren meetellen (bijvoorbeeld als je vindt dat 3 een deler van 15 is, dan ook 5 (=15/3)).
In theory, there's no difference between theory and practice. In practice, there is.

#10

Benm

    Benm


  • >5k berichten
  • 8808 berichten
  • VIP

Geplaatst op 10 augustus 2008 - 11:59

Dat sowieso, maar het gaat nog rapper als je een array van priemgetallen hebt die loopt tot de wortel van je getal. Zolang het om 561 gaat en niet om 561.123.143.998 zou ik me er alleen niet zo druk om maken :D
Victory through technology

#11

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 10 augustus 2008 - 12:49

Dat sowieso, maar het gaat nog rapper als je een array van priemgetallen hebt die loopt tot de wortel van je getal. Zolang het om 561 gaat en niet om 561.123.143.998 zou ik me er alleen niet zo druk om maken ;)

Dat getal is nog net iets aan de kleine kant. :D
[(t, 561123143998 `div` t) | t <- [x | x <- [1..749082], 561123143998 `mod` x ==0]]
Deze code produceert het antwoord in 1.59 seconden (daar wil ik best op wachten :P ).

Natuurlijk heb je volledig gelijk dat het niet eeuwig goed zal gaan op deze manier. Een methode op basis van priemfactoren zal dan uitkomst bieden. Voorbeeld: de volgende code runt in 0.02 seconden.
[(2^a)*(1907^b)*(11933^c)*(12329^d) | a <- [0,1], b <-[0,1], c<-[0,1], d<-[0,1]]
Delers:
1
2
1907
3814
11933
12329
23866
24658
22756231
23511403
45512462
47022806
147121957
294243914
280561571999
561123143998

#12

Raul

    Raul


  • >100 berichten
  • 159 berichten
  • Ervaren gebruiker

Geplaatst op 10 augustus 2008 - 13:29

Het kan nog een stuk eerder, je hoeft slechts tot de wortel van x te zoeken.

Wel bij iedere gevonden deler beide factoren meetellen (bijvoorbeeld als je vindt dat 3 een deler van 15 is, dan ook 5 (=15/3)).


Hi Roger

met computer opgelost geeft x/2 alle delers maar [wortel]x niet

vb:

int x = 1, teller = 1, wortel = 0, helft = 0;   scanf("%d",&x);  wortel = sqrt(x);  helft = x/2;  printf("Tot wortel van x: \n");    do{    if (x%teller == 0){      printf("%d ",(x/teller));    }  teller++;  } while (wortel >= teller);    printf("\n\nTot helft van x: \n");    for (teller=1; teller<=helft;teller++){      if (x%teller == 0){      printf("%d ",(x/teller));    }      }

resultaat
Geplaatste afbeelding

Groetjes
Doe niet jouw best om te leven, maar doe uw best om het leven een zin te geven.! (mijn eigen overtuiging)

#13

Raul

    Raul


  • >100 berichten
  • 159 berichten
  • Ervaren gebruiker

Geplaatst op 10 augustus 2008 - 13:38

Dat sowieso, maar het gaat nog rapper als je een array van priemgetallen hebt die loopt tot de wortel van je getal.

Werkt het dan ?

Zolang het om 561 gaat en niet om 561.123.143.998 zou ik me er alleen niet zo druk om maken :D


Dit begrijp ik helemaal niet

groetjes
Doe niet jouw best om te leven, maar doe uw best om het leven een zin te geven.! (mijn eigen overtuiging)

#14

Benm

    Benm


  • >5k berichten
  • 8808 berichten
  • VIP

Geplaatst op 10 augustus 2008 - 14:24

Deze code produceert het antwoord in 1.59 seconden (daar wil ik best op wachten ).


Dat gaat best rap inderdaad... misschien had ik dr een paar extra cijfers aan moeten verzinnen :D

Werkt het dan ?


Met priemgetallen? Feitelijk hoef je alleen maar de deelbaarheid door priemgetallen te testen, niet door alle getallen. Als bijv blijkt dat iets deelbaar is door zowel 2 als 3, dan weet je bij voorbaat dat het ook deelbaar is door 6, en hoef je dat niet meer te testen.

Zo ook bijvoorbeeld:

1
2
1907
3814
...



Die 3814 hoef je niet te testen aangezien je 2 en 1907 al wist.
Victory through technology

#15

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 10 augustus 2008 - 14:33

Hi Roger

met computer opgelost geeft x/2 alle delers maar [wortel]x niet

Wel bij iedere gevonden deler beide factoren meetellen (bijvoorbeeld als je vindt dat 3 een deler van 15 is, dan ook 5 (=15/3)).


Dus je code in het midden wordt dan: (in het groen wat ik heb toegevoegd)

if (x%teller == 0){
printf("%d ",(x/teller));
if (teller<wortel){
printf("%d ",teller);
}

}


Die if (teller<wortel) staat erbij zodat als de teller precies de wortel wordt, hij die wortel niet twee keer uitprint. Als dubbelen geen bezwaar zijn kun je die if weglaten. (bij 561 komt dat niet voor, het getal moet natuurlijk een kwadraat zijn wil de wortel een deler zijn)

Veranderd door Rogier, 10 augustus 2008 - 14:39

In theory, there's no difference between theory and practice. In practice, there is.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures