Alle delers van een bepaald getal bepalen

Moderators: dirkwb, Xilvo

Forumregels
(Middelbare) school-achtige vragen naar het forum "Huiswerk en Practica" a.u.b.
Zie eerst de Huiswerkbijsluiter
Gebruikersavatar
Berichten: 159

Alle delers van een bepaald getal bepalen

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

Code: Selecteer alles

  int a = 1;

  int teller = 1;

    

  scanf("%d",&a);

  do{

    if (a%teller == 0){

      printf("%d ",(a/teller));

    }

    teller++;

  } while (a >= teller);
Groetjes
Doe niet jouw best om te leven, maar doe uw best om het leven een zin te geven.! (mijn eigen overtuiging)

Berichten: 7.068

Re: Alle delers van een bepaald getal bepalen

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


Haskell:

Code: Selecteer alles

[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).

Berichten: 38

Re: Alle delers van een bepaald getal bepalen

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

Berichten: 7.068

Re: Alle delers van een bepaald getal bepalen

Ik denk dat als je over de helft bent je wel kunt stoppen met zoeken.
Weet ik wel zeker. :D

Gebruikersavatar
Berichten: 159

Re: Alle delers van een bepaald getal bepalen

EvilBro schreef:Haskell:

Code: Selecteer alles

[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)

Berichten: 38

Re: Alle delers van een bepaald getal bepalen

Code: Selecteer alles

  int a = 1;

  int teller = 1;

  [b]int helft = 0;[/b]    

  scanf("%d",&a);

  [b]helft = a/2;[/b]

  do{

    if (a%teller == 0){

      printf("%d ",(a/teller));

    }

    teller++;

  } while ([b]helft[/b] >= teller);
Als het niet gebruikelijk is moet je het zeker niet doen ... maar mogelijk is het wel hoor, en 2x zo rap.

Berichten: 7.068

Re: Alle delers van een bepaald getal bepalen

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).

Gebruikersavatar
Berichten: 159

Re: Alle delers van een bepaald getal bepalen

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

Mijn excuses

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

Gebruikersavatar
Berichten: 5.679

Re: Alle delers van een bepaald getal bepalen

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.

Berichten: 12.262

Re: Alle delers van een bepaald getal bepalen

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

Berichten: 7.068

Re: Alle delers van een bepaald getal bepalen

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

Code: Selecteer alles

[(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.

Code: Selecteer alles

[(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

Gebruikersavatar
Berichten: 159

Re: Alle delers van een bepaald getal bepalen

Rogier schreef: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:

Code: Selecteer alles

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

Afbeelding

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

Gebruikersavatar
Berichten: 159

Re: Alle delers van een bepaald getal bepalen

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)

Berichten: 12.262

Re: Alle delers van een bepaald getal bepalen

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

Gebruikersavatar
Berichten: 5.679

Re: Alle delers van een bepaald getal bepalen

Raul schreef: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)

[pre]

if (x%teller == 0){

printf("%d ",(x/teller));

if (teller<wortel){

printf("%d ",teller);

}


}[/pre]

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)
In theory, there's no difference between theory and practice. In practice, there is.

Reageer