Springen naar inhoud

Programmeerprobleem


  • Log in om te kunnen reageren

#1

Mark1

    Mark1


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 24 april 2007 - 12:05

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

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

#2

TD

    TD


  • >5k berichten
  • 24052 berichten
  • VIP

Geplaatst op 24 april 2007 - 12:07

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)

#3

Mark1

    Mark1


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 24 april 2007 - 12:56

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?

#4

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 24 april 2007 - 13:16

Lees: http://en.wikipedia....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

#5

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 24 april 2007 - 13:19

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

#6

Mark1

    Mark1


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 24 april 2007 - 13:58

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

#7

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 24 april 2007 - 14:32

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

#8

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 24 april 2007 - 15:15

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.

#9

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 24 april 2007 - 18:07

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.

#10

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 24 april 2007 - 19:45

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

#11

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 24 april 2007 - 20:10

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

Veranderd door EvilBro, 24 april 2007 - 20:11


#12

Mark1

    Mark1


  • 0 - 25 berichten
  • 20 berichten
  • Gebruiker

Geplaatst op 25 april 2007 - 09:32

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

#13

Schwartz

    Schwartz


  • >250 berichten
  • 691 berichten
  • Verbannen

Geplaatst op 25 april 2007 - 10:51

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.

#14

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 25 april 2007 - 15:05

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

#15

CloudedHeaven

    CloudedHeaven


  • >100 berichten
  • 249 berichten
  • Ervaren gebruiker

Geplaatst op 25 april 2007 - 16:54

(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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures