Programmeerprobleem

Moderators: jkien, Xilvo

Berichten: 20

Programmeerprobleem

Beste mensen,

Ik hoop dat ik met dit probleem in het juiste gedeelte van het forum zit, mocht dit niet het geval dan zijn hoop ik dat de mods zo vriendelijk willen zijn het te verplaatsen.

Ik ben op het internet het onderstaande probleem tegengekomen:

Can you find a five digit number which has no zeros no digit is repeated, where:

The first digit is a prime number.

The second digit is the fifth digit minus the first digit.

The third digit is twice the first digit.

The fourth digit is the third digit plus three.

The fifth digit is the difference between the first digit and the fourth digit.


Ik wilde een programma in vb.net schrijven dat dit 5 cijferige getal vind. Het leek mij verstandig om eerst een functie te schrijven die als argumenten een 5 cijferig getal en een nummer n (1-5) meekrijgt en vervolgens het nde cijfer van dat getal teruggeeft. Mijn functie ziet er zo uit:

Private Function digit(ByVal getal As Integer, ByVal n As Integer) As Integer

Return Int((getal / Math.Pow(10, 6 - n) - Int(getal / Math.Pow(10, 6 - n))) * 10)

End Function

In de meeste gevallen doet deze functie wat hij hoort te doen, soms zit hij er echter naast. Bijvoorbeeld als ik van het getal 15246 het 5de cijfer wil weten (6 dus) dan geeft hij 5 terug. Wat voor mij extra verwarrend is, is dat getal / Math.Pow(10, 6 - n) volgens het programma gelijk is aan 1524,6 en dat Int(getal / Math.Pow(10, 6 - n)) volgens het programma gelijk is aan 1524 maar dat getal / Math.Pow(10, 6 - n) - Int(getal / Math.Pow(10, 6 - n)) gelijk is aan 0,59999999.

Kan iemand mij vertellen wat ik fout doe? :(

Mvg,

Mark

Gebruikersavatar
Berichten: 24.578

Re: Programmeerprobleem

Omdat het je om het programmeren te doen is, verplaats ik het naar informatica.

Met wat logisch redeneren: eerste kan enkel 2, 3, 5 of 7 zijn. Maar derde is het dubbel en moet een digit zijn, dan vallen 5 en 7 af. Blijft over: 2 en 3. Dan heb je nog maar twee gevallen na te gaan, bij 3 zal blijken dat je een dubbele digit hebt en met 2 vind je: 23475.
"Malgré moi, l'infini me tourmente." (Alfred de Musset)

Berichten: 20

Re: Programmeerprobleem

Hmm ik had nog niet gezien dat er nu ook een apart informatica gedeelte is. Dit is inderdaad een betere plek voor deze vraag.

@TD: Bedankt voor de oplossing. Ik had al wel een vermoeden dat het ongeveer zo opgelost kan worden. Ik probeer

mijn programmeervaardigheden een beetje te vergroten vandaar dat ik het nu via de computer probeer.

Maar ik ben eigenlijk nog steeds benieuwd waarom de functie niet doet wat ik wil. Heeft iemand enig idee?

Gebruikersavatar
Lorentziaan
Berichten: 5.079

Re: Programmeerprobleem

Lees: http://en.wikipedia.org/wiki/Floating_poin...curacy_problems

Je kunt beter een array maken van 5 integer plaatsen.

Welke programmeertaal gebruik je eigenlijk?
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs

Berichten: 7.068

Re: Programmeerprobleem

Hij zegt vb.net (Visual Basic dot Net).

Berichten: 20

Re: Programmeerprobleem

@qrnlk: Bedankt voor de snelle reactie! Dat verhaal op wikipedia ziet er op het eerste gezicht redelijk ingewikkeld uit dus dat ga ik lezen als ik meer tijd heb. Ik denk dat een array inderdaad het beste is aangezien het op deze manier niet lukt. Wel jammer ik vind dit toch een mooiere oplossing.

De programmeertaal die ik gebruik is zoals EvilBro al aangaf Visual Basic .NET. Met deze taal, die alleen geschikt is voor windows, kan je de formulieren samenstellen door de onderdelen er op te slepen. Dit bespaard dus een hoop (saai) programmeerwerk. Ik heb begrepen dat de taal echter wel een stuk beperkter dan bijv. c++. Ik ben zelf te onervaren om uit te leggen wat precies het verschil is.

Gebruikersavatar
Lorentziaan
Berichten: 5.079

Re: Programmeerprobleem

De meeste talen zijn gelijke krachtig in de zin dat je dezelfde programmas er in kunt schrijven.

Mijn ervaring is dat talen zoals C, Java, Pascal leiden tot programmas met veel te veel regels code. Deze talen zijn gewoon erg lang draderig. Het is alsof je wetgeving of de boekhouding schrijft en leest. Programmas die hetzelfde doen geschreven in talen zoals Lisp, Ruby, Haskell, Python zijn meestal significant korter: Dat schrijft en lees veel prettiger.

Het probleem hierboven zou ook wel leuk zijn voor Prolog.

NB: In hexadecimaal is er een tweede oplossing mogelijk 53AD8
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs

Gebruikersavatar
Berichten: 6.905

Re: Programmeerprobleem

qrnlk heeft gelijk wat de lengte van de code betreft

python is zeer kort, maar haskell en ruby doen soms korter

het aller kortste is J

Visual basic is in die mate beperkt dat het linux niet ondersteunt, en een runtime nodig heeft.

ook zou ik het niet gebruiken voor toepassingen waarvoor snelheid vereist is.

Ik geef de voorkeur aan python, omdat platvorm onafhankelijk is, relatief snel, ook compileer baar en een grote library.

ik ben wel aan het wachten op de inburgering van http://boo.codehaus.org/

@Mark1: als je nog problemen zoekt projecteuler.net
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Berichten: 7.068

Re: Programmeerprobleem

Programmas die hetzelfde doen geschreven in talen zoals Lisp, Ruby, Haskell, Python zijn meestal significant korter: Dat schrijft en lees veel prettiger.
Gaarne het gegeven vraagstuk te schrijven in Lisp of Haskell (anders moet ik weer iets nieuws installeren en ik ben lui :( ) en de code hier posten. Tevens posten hoe lang je erover gedaan hebt om de code te produceren. Bij voorbaat dank.

Gebruikersavatar
Lorentziaan
Berichten: 5.079

Re: Programmeerprobleem

Voor dit probleem zal het wel niet zo heel erg veel uitmaken. Het verschil wordt duidelijker namate de software groter wordt en vaker wordt aangepast. Ik had het dan ook over "mijn ervaring" en niet over dit specifieke programma maar dat was volgens mij ook wel duidelijk in mijn post.
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs

Berichten: 7.068

Re: Programmeerprobleem

Ik had het dan ook over "mijn ervaring"
Ja, dat snap ik. Ik vroeg daarentegen gewoon om een versie in bijvoorbeeld Haskell. Ik ben namelijk benieuwd hoe iemand met "ervaring" dit probleem oplost in Haskell (danwel Lisp, maar liever Haskell).

Berichten: 20

Re: Programmeerprobleem

Ik heb het programma inmiddels, zoals qrnlk al zei, met een array gemaakt. Het werkt prima, de code is alleen wat omslachtiger dan de code die ik aanvankelijk in gedachte had. Iedereen bedankt voor de reacties, ik denk dat ik me binnenkort maar eens ga verdiepen in een andere taal om zelf het verschil te ervaren.

@jhnbk: Bedankt voor de link! Dit ziet eruit als iets waar ik mij wel mee kan vermaken :-D

Gebruikersavatar
Berichten: 691

Re: Programmeerprobleem

In pascal kan men best kort schrijven, als men maar een goede bibliotheek heeft van routinen.

En niet voor elk wissewasje weer een type gebruiken.

Ik schrijf nu meestal met mijn eigen taal APRAS en die compileert en vertaalt naar pascal (delphi).

In APRAS staat achter elk [ teken een commando ..

Voorbeeld:

[ :-) PROCEDURE minmax_io([IO] X:int64;[CONST] v,w:int64)]

notitie: routine-exit: direkt verlaten van de routine

[BEGIN]

test inzake de laagste [IF x<v] [LET X:=v] [ROUTINE-EXIT] [ENDIF]

test inzake de hoogste [IF x>w] [LET X:=w] [ROUTINE-EXIT] [ENDIF]

[ENDPROC]

We hebben in apras reeds de minmax:

[LET x:=[MINMAX x,10,11]]

Ben er druk mee bezig om vele functies 100% te bekomen.

De taal kan men intypen op txt en htm.

Vertaald is de minmax routine:

(en de procedure aanmelden dat ie aanwezig is)

Procedure minmax_io(VAR x:int64;const v,w:int64);

{notitie: exit: direkt verlaten van de routine}

begin

{test inzake de laagste} if x<v then begin x:=v;exit;end;

{test inzake de hoogste} if x>w then begin x:=w;exit;end;

end;

De routine werkt optimaal:

Door de const opgave zal de compiler niet weer alles kopieren maar alleen het adres toepassen.

Bij strings geeft dit enorme snelheidswinsten.

In APRAS hoef ik niet de routine aan te melden want dit handelt de compiler zelf af. :(
Een computertaal is voor mensen, niet voor de computer.

Gebruikersavatar
Berichten: 6.905

Re: Programmeerprobleem

@Schwartz: wel fijn om een eigen programmeertaal te hebben, is deze al volledig bruikbaar, of zijn er nog steeds mankementen?

@Mark1: die problemen die daar staan gaan van echt easy tot afgrijselijk moeilijk (meestal komt er een groot deel voorstudie bij kijken, en dat is dan meestal "zwaar" wiskundig)
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Berichten: 249

Re: Programmeerprobleem

(visualbasic 2005.Net)

Dit ook goed qua oplossing?

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim nTeller As Integer
'functie digit 5 keer aanroepen met het zelfde getal
'het n-de getal weergeven in tekstvak zetten
For nTeller = 1 To 5
TextBox1.Text += digit(12345, nTeller).ToString() + vbCrLf
Next
End Sub

Private Function digit(ByVal getal As Integer, ByVal n As Integer) As Integer
' bepalen van een getal op een bepaalde plaats - van links naar rechts
Dim sGetal As String
Dim sN As String
'getal omzetten naar string
sGetal = getal.ToString()
'isoleren van gewenste cijfer van betreffende plaats
sN = sGetal.Substring(n - 1, 1)
n = Integer.Parse(sN)
Return n
End Function

End Class

Reageer