Springen naar inhoud


- - - - -
Solved

Opdracht 005



  • Log in a.u.b. om te beantwoorden
Er zijn 8 reacties in dit onderwerp

#1 RedThread

RedThread

    Beheerder VBIB

  • Beheerder
  • 3590 berichten
    Laatst bezocht 15 mei 2018 10:05
  • LocatieTongeren,Belgium.
Inzender

Geplaatst op 14 oktober 2010 - 12:50

Citeren

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?


#2 RedThread

RedThread

    Beheerder VBIB

  • Beheerder
  • 3590 berichten
    Laatst bezocht 15 mei 2018 10:05
  • LocatieTongeren,Belgium.
Inzender

Geplaatst op 14 oktober 2010 - 12:50

Visual Basic Code:
Dim Number As Integer = 22
Dim NotFound As Boolean = False
Do
For I As Integer = 1 To 20
If Number Mod I > 0 Then
NotFound = True
End If
Next
If NotFound = False Then Exit Do
NotFound = False
Number += 2
Loop
TextBox1.Text = Number



#3 Vozzie

Vozzie

    Moderator

  • Leden
  • PipPipPipPipPipPipPip
  • 1855 berichten
    Laatst bezocht 12 jul 2017 13:15
Inzender

Geplaatst op 14 oktober 2010 - 18:18

Hallo,

Kleine optimalisatie.

Visual Basic Code:
' best op 20 beginnen want we verhogen met 20 en het moet deelbaar zijn door 20
' door te verhogen met 20 komen we het rapst op dat getal
Dim number As Integer = 20
Do
	Dim found As Boolean = True
	' beginnen op 2 want alle getallen zijn deelbaar door 1
	' dus dat hoeven we niet te testen
	For i As Integer = 2 To 20
		If (number Mod i) <> 0 Then
			found = False
			Exit For
		End If
	Next
	If found Then Return number
	' omdat het deelbaar moet zijn door 20
	' verhogen met 20
	number += 20
Loop

Vraag me af of er geen formule bestaat die het in 1 berekening kan?

Groeten

#4 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 30 jan 2017 23:38

Geplaatst op 14 oktober 2010 - 20:08

Hallo,

Grote optimalisatie. Je moet wel "Imports System.Linq" gebruiken:



Visual Basic Code:
		Dim priemverzameling As List(Of Integer) = New List(Of Integer)
		Dim total As Integer = 1

		'Verzameling met priemgetallen maken die nodig zijn om tot het antwoord te komen
		For n As Integer = 2 To 20
			Dim nn As Integer = n
			'Eerst n delen door alle priemgetallen in de verzameling waardoor gedeeld kan worden
			For Each deler In From priem In priemverzameling Where nn Mod priem = 0
				nn \= deler
			Next

			'Als er een rest overgebleven, dit getal toevoegen aan de verzameling priemgetallen
			If nn <> 1 Then
				priemverzameling.Add(nn)
				total *= nn
			End If
		Next
		'Return total


Dit is geoptimaliseerd van 39834014 naar 24 iteraties. De iteraties van Linq welke niet voldoen aan de query niet meegeteld.

Als je geen Linq wilt gebruiken maar het zelf controleert met een for each dan zijn het 126 iteraties.

#5 Vozzie

Vozzie

    Moderator

  • Leden
  • PipPipPipPipPipPipPip
  • 1855 berichten
    Laatst bezocht 12 jul 2017 13:15
Inzender

Geplaatst op 14 oktober 2010 - 20:29

Knap Josk, maar het is nog een paar keer rapper met strong typing/zonder infer/linq  :(

Daarom, altijd option strict on, explicit on, infer off, :D

Visual Basic Code:
Option Explicit Off
Option Strict Off

Module Module1

	Sub Een()
		Dim priemverzameling As List(Of Integer) = New List(Of Integer)
		Dim total As Integer = 1
		'Verzameling met priemgetallen maken die nodig zijn om tot het antwoord te komen
		For n As Integer = 2 To 20
			Dim nn As Integer = n
			'Eerst n delen door alle priemgetallen in de verzameling waardoor gedeeld kan worden
			For Each deler In From priem In priemverzameling Where nn Mod priem = 0
				nn \= deler
			Next
			'Als er een rest overgebleven, dit getal toevoegen aan de verzameling priemgetallen
			If nn <> 1 Then
				priemverzameling.Add(nn)
				total *= nn
			End If
		Next
	End Sub

	Sub Twee()
		Dim priemverzameling As New List(Of Integer)
		Dim total As Integer = 1
		'Verzameling met priemgetallen maken die nodig zijn om tot het antwoord te komen
		For n As Integer = 2 To 20
			Dim nn As Integer = n
			'Eerst n delen door alle priemgetallen in de verzameling waardoor gedeeld kan worden
			For Each deler As Integer In priemverzameling
				If (nn Mod deler) = 0 Then
					nn \= deler
				End If
			Next
			'Als er een rest overgebleven, dit getal toevoegen aan de verzameling priemgetallen
			If nn <> 1 Then
				priemverzameling.Add(nn)
				total *= nn
			End If
		Next
	End Sub

	Sub Main()
		Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Highest
		DoeEen()
		DoeTwee()
		DoeEen()
		DoeTwee()
		DoeEen()
		DoeTwee()
		DoeEen()
		DoeTwee()
		Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal
		Console.ReadKey()
	End Sub

	Sub DoeEen()
		Dim sw As New Stopwatch()
		Console.Write("Een = ")
		sw.Reset()
		sw.Start()
		Een()
		sw.Stop()
		Console.WriteLine(sw.Elapsed.ToString())
	End Sub

	Sub DoeTwee()
		Dim sw As New Stopwatch()
		Console.Write("Twee = ")
		sw.Reset()
		sw.Start()
		Twee()
		sw.Stop()
		Console.WriteLine(sw.Elapsed.ToString())
	End Sub

End Module

Groeten

#6 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 30 jan 2017 23:38

Geplaatst op 14 oktober 2010 - 21:32

Vozzie,

Grappig: Wat jij daar hebt getikt in Twee() had ik in eerste instantie bijna letterlijk (ik had alleen de haakjes niet om (nn Mod deler))! Zodoende had ik die 126 iteraties ook geteld.

Echter heb ik het daarna omgebouwd naar LINQ omdat ik daarmee aan het oefenen ben.

#7 Vozzie

Vozzie

    Moderator

  • Leden
  • PipPipPipPipPipPipPip
  • 1855 berichten
    Laatst bezocht 12 jul 2017 13:15
Inzender

Geplaatst op 14 oktober 2010 - 21:51

@josk

Afgekeken van jou, daardoor :D...

Linq is goed voor Extreme Programming. Voor database toepassingen en dergelijk,... Maar voor performance is de goeie oude code nog steeds het beste,...

Groeten...

#8 Jark

Jark

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 560 berichten
    Laatst bezocht 30 jul 2012 13:56

Geplaatst op 15 oktober 2010 - 09:05

Hallo,

Leuke oplossingen allemaal, zag wat dingen in dit topic en voelde de noodzaak om een reply te geven.

Josk79: misschien is het leuk om voor de wat zwaardere computaties te kijken naar plinq(parallele linq queries, sneller op meerdere procs) --> http://msdn.microsof...y/dd460688.aspx.

Vozzie: met option strict on en option explicit on ben ik het eens, maar option infer? Option Infer maakt geen verschil voor de performance in je code, de compiler zal overal waar je bijvoorbeeld Dim obj = "test" gebruikt vervangen door Dim obj As String = "test". --> http://msdn.microsof...y/bb384665.aspx.

Mvg,

Jark

#9 Vozzie

Vozzie

    Moderator

  • Leden
  • PipPipPipPipPipPipPip
  • 1855 berichten
    Laatst bezocht 12 jul 2017 13:15
Inzender

Geplaatst op 15 oktober 2010 - 11:40

Hallo,

PLINQ kende ik nog niet,....

Jark zei:

Vozzie: met option strict on en option explicit on ben ik het eens, maar option infer? Option Infer maakt geen verschil voor de performance in je code, de compiler zal overal waar je bijvoorbeeld Dim obj = "test" gebruikt vervangen door Dim obj As String = "test". --> http://msdn.microsof...y/bb384665.aspx.

Heb mezelf verkeerd uitgedrukt... (Komt doordat Linq zonder Infer heel moeilijk en mss in bepaalde gevallen onmogelijk is. Dus onafscheidelijk vanuit dit hoekpunt)

Option Infer heeft geen impact op performance maar wel op readability(leesbaarheid van de code)... daarom standaard regel bij mij "strict on, explicit on, infer off"

Readability is toch wel heel belangrijk als je code op een forum plaatst.( comment verhoogt ook readability, iets wat ik te weinig doe ook, hoeft niet als de code self explanatory is, of de context de code verduidelijkt)

En om de puntjes op de i te zetten. Readability verhoogt oa productiviteit en vooral onderhoudbaarheid, dus in bepaalde gevallen nog steeds sneller :P



Groeten





Ook met taq Solved voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[Solved] Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)