Springen naar inhoud


- - - - -

Opdracht 052


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

#1 Dominiek

Dominiek

    Senior Developer

  • Leden
  • PipPipPip
  • 120 berichten
    Laatst bezocht 11 mei 2016 14:42

Geplaatst op 03 december 2010 - 17:26

Citeren

Problem 52
It can be seen that the number, 125874, and its double, 251748, contain exactly the same digits, but in a different order.

Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits.
Op een wel heel slechte manier opgelost, maar hier moest ik niet zo veel nadenken om de code te schrijven B)
De getallen zijn:
x:  142857
2x: 285714
3x: 428571
4x: 571428
5x: 714285
6x: 857142
- Wat me meteen opvalt, is dat dit om dezelfde getallen gaat als in hun voorbeeld. Toeval?
- Wat ook nog opvalt is dat als je 142857x7 doet je precies aan 999999 komt. Toeval?
- 4x, 5x, 6x was ook niet meer nodig, vanaf 3x kom je al aan 142857 uit. Toeval?
- Hun getal is ook het laagste dat bij verdubbeling uit dezelfde cijfers bestaat. Ook wel vreemd dat bij 3x, 4x, 5x, 6x erbij je een getal krijgt dat niet zoveel hoger is.

Visual Basic Code:
		Dim x As Long = 1
		Dim x2, x3, x4, x5, x6 As Long
		Dim ok As Boolean
		Do While ok = False
			Dim getal(0 To Len(x.ToString) - 1) As Integer
			For i As Integer = 0 To Len(x.ToString) - 1
				getal(i) = Mid(x, i + 1, 1)
			Next
			Array.Sort(getal)
			x2 = 2 * x
			Dim getal2(0 To Len(x2.ToString) - 1) As Integer
			For i As Integer = 0 To Len(x2.ToString) - 1
				getal2(i) = Mid(x2, i + 1, 1)
			Next
			Array.Sort(getal2)
			For i As Integer = 0 To Len(x.ToString) - 1
				If getal(i) <> getal2(i) Then
					ok = False
					Exit For
				Else
					ok = True
				End If
			Next
			If ok = True Then
				x3 = 3 * x
				Dim getal3(0 To Len(x3.ToString) - 1) As Integer
				For i As Integer = 0 To Len(x3.ToString) - 1
					getal3(i) = Mid(x3, i + 1, 1)
				Next
				Array.Sort(getal3)
				For i As Integer = 0 To Len(x.ToString) - 1
					If getal(i) <> getal3(i) Then
						ok = False
						Exit For
					Else
						ok = True
					End If
				Next
				If ok = True Then
					x4 = 4 * x
					Dim getal4(0 To Len(x4.ToString) - 1) As Integer
					For i As Integer = 0 To Len(x4.ToString) - 1
						getal4(i) = Mid(x4, i + 1, 1)
					Next
					Array.Sort(getal4)
					For i As Integer = 0 To Len(x.ToString) - 1
						If getal(i) <> getal4(i) Then
							ok = False
							Exit For
						Else
							ok = True
						End If
					Next
					If ok = True Then
						x5 = 5 * x
						Dim getal5(0 To Len(x5.ToString) - 1) As Integer
						For i As Integer = 0 To Len(x5.ToString) - 1
							getal5(i) = Mid(x5, i + 1, 1)
						Next
						Array.Sort(getal5)
						For i As Integer = 0 To Len(x.ToString) - 1
							If getal(i) <> getal5(i) Then
								ok = False
								Exit For
							Else
								ok = True
							End If
						Next
						If ok = True Then
							x6 = 6 * x
							Dim getal6(0 To Len(x6.ToString) - 1) As Integer
							For i As Integer = 0 To Len(x6.ToString) - 1
								getal6(i) = Mid(x6, i + 1, 1)
							Next
							Array.Sort(getal6)
							For i As Integer = 0 To Len(x.ToString) - 1
								If getal(i) <> getal6(i) Then
									ok = False
									Exit For
								Else
									ok = True
								End If
							Next
						End If
					End If
				End If
			End If
			If ok = True Then
				Label1.Text = x
				Label2.Text = x2
				Label3.Text = x3
				Label4.Text = x4
				Label5.Text = x5
				Label6.Text = x6
			End If
			x = x + 1
		Loop


#2 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 03 december 2010 - 22:02

Goed, maar met iets meer nadenken kom je op zoiets:

Visual Basic Code:
		Public Function Solve() As String

			Dim x As Integer = 1
			Do
				Dim xCharsString As String = x.ToString

				For n As Integer = 2 To 6
					Dim m As Integer = n * x
					If Not SameCharacters(xCharsString, m.ToString) Then
						Exit For
					ElseIf n = 6 Then
						Return x.ToString
					End If
				Next
				x += 1
			Loop

		End Function

		Private Function SameCharacters(ByVal str1 As String, ByVal str2 As String) As Boolean
			If str1.Length <> str2.Length Then Return False
			For i As Integer = 0 To str1.Length - 1
				Dim j As Integer
				For j = 0 To str2.Length - 1
					If str1(i) = str2(j) Then
						str2.Remove(j)
						Exit For
					End If
				Next
				If j = str2.Length Then Return False
			Next
			Return True
		End Function


PS: Die SameCharacters is misschien beetje overdone, maar gaat sneller dan steeds een Character-array sorteren.




0 gebruiker(s) lezen dit onderwerp

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

Inloggen


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)