Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

Formule raadsel oplossen met python

Pagina: 1
Acties:

Onderwerpen

Vraag


  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
Mijn vraag :
Ik heb sinds enkele weken mijn eerste pythonstappen gezet .
Met de eenvoudige dingen die ik al geleerd heb heb ik geprobeerd een programma te schrijven om een raadsel op te lossen uitgaande van een bepaalde formule.
De eerste ingave van variabelen gaven de juiste oplossing maar bij de derde kreeg ik een fout antwoord. Ik heb alles al diverse malen herschreven maar ik vindt de fout niet. Ik vermoed echter dat er een probleem is met een voorloopnul die iets in de war stuurt.
Is er iemand die ziet waar ik misschien een fout gemaakt heb en/of hoe het op te lossen is?
Het uitgangspunt is : je hebt een jaargetal van 01 tot 99 (bv.46) en een getal dat begint met een 2. ( bv. 2096436058700).
Als ik 46% bereken van 2096436058700 moet ik dezelfde cijfers bekomen maar met de 2 verschoven naar de laatste plaats. Dat wordt dan 964360587002.
De berekening is afhankelijk van een aantal nullen dat men bij moet gebruiken na het eerste getal.

Zie hierbij wat ik geschreven heb en welke oplossingen ik kreeg.
Y = 2 en X = andere cijfers van het getal


De gegevens voor de twee juiste berekeningen zijn : jaar 55 - nullen 5 en jaar 46 - nullen 12
De gegevens waarbij het fout zit zijn : jaar 32- nullen 21


Y = 2
jaar = 32
nul = 21
teller = Y * ( jaar * pow(10, nul) - 100 )
noemer = (1000 - jaar)
print("Het gevraagde getal YX is:", (( Y * pow(10, nul))) + (int (teller // noemer )))
print("Het gevraagde getal YX *", jaar, " % is getal XY :", (int((( Y * pow(10, nul)) + (int(teller / noemer))) * jaar/100 )))

pythonoplossing:

Het gevraagde getal YX is: 211640
Het gevraagde getal YX * 55 % is getal XY : 116402
>>>
= RESTART:
Het gevraagde getal YX is: 2096436058700
Het gevraagde getal YX * 46 % is getal XY : 964360587002
>>>
= RESTART:
Het gevraagde getal YX is: 2066115702479338842975
Het gevraagde getal YX * 32 % is getal XY : 661157024793388384256


De juiste oplossing voor het laatste deel zou moeten zijn :

2066115702479338842975 * 32 % = 661157024793388429752

Heeft iemand een ideetje ?

Relevante software en hardware die ik gebruik
...Mac OS

Wat ik al gevonden of geprobeerd heb
...

Alle reacties


  • heuveltje
  • Registratie: februari 2000
  • Laatst online: 11:43

heuveltje

KoelkastFilosoof

1993scarlet schreef op woensdag 8 juli 2020 @ 11:01:

Is er iemand die ziet waar ik misschien een fout gemaakt heb en/of hoe het op te lossen is?
Het uitgangspunt is : je hebt een jaargetal van 01 tot 99 (bv.46) en een getal dat begint met een 2. ( bv. 2096436058700).
Als ik 46% bereken van 2096436058700 moet ik dezelfde cijfers bekomen maar met de 2 verschoven naar de laatste plaats. Dat wordt dan 964360587002.
Misschien dat ik omdat de achtergrond niet begrijp, ik het niet snap.
Maar in je voorbeeld heb je het alleen over simpel weg 46% van een getal pakken.
Het feit dat geen van je variable een verklarende naam hebben helpt ook niet bepaald.
(wat is x, wat is y, een variable nul noemen die vervolgens een int anders dan 0 bevat is al helemaal verwarrend)

en vervolgens zeg je.
De berekening is afhankelijk van een aantal nullen dat men bij moet gebruiken na het eerste getal.

Om vervolgens te gaan machtsverheffen. en dan te klagen dat het percentage niet klopt.
Wat ben je dan precies aan het berekenen ? en hoe zeker ben je dat de wiskundige fomule daarin klopt met je verwachting.

[Voor 9% gewijzigd door heuveltje op 08-07-2020 11:16]

You cant build a better world for people.
Only people can build a better world for people.
Otherwise its just a fancy cage. T. Pratchett


  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
@ Heuveltje : alles staat nochtans al vermeld.

-Achtergrond : het is gewoon een wiskundige eigenaardigheid , niet meer of minder.
-46% pakken zoals je het noemt : de variabele "jaar" geeft dit percentage aan en kan van 00 tot 99 gaan. De voorbeelden die ik gaf hebben het bv. over 55% ( jaar(19)55 , over 46% (19)46 en 32% (jaar19)32 maar kan dus elk jaartal zijn tussen 00 en 99.
-de naam van de variabelen is toch duidelijk : jaar is het laatste deel van het jaartal ,
nul is het aantal nullen dat men in de formule moet gebruiken , teller is de formule die je de teller geeft en noemer is de formule die je de noemer geeft.
- Y is zoals gezegd het eerste deel van een getal (hier 2) en X de andere cijfers ( hier in het eerst opgeloste geval bv. 11640) dus in dit geval is YX 211640 en XY 116402.
-en variabele "nul" noemen ? Waarom niet , die "nul" wordt op alle plaatsen gebruikt als het getal dat het moet voorstellen bv in het voorbeeld bovenaan bij het jaar (19)32 als 21.
-in de 3 uitgewerkte voorbeelden komt "nul" voor als 5 ( bij 55%) , als 12 (bij 46%) of als 21 bij 46%. Maar dat heeft verder geen belang want het klopt in de formule.Je past het cijfer gewoon aan in de variabele.
-machtverheffing :de machtverheffing (10, 21) dient natuurlijk op Y de juiste plaats te geven vooraan in het getal. Bij de 2 andere voorbeelden is bv. pow(10, 5) en pow(10.12) gebruikt.
-wat ben je aan het berekenen? : gewoon 2 getallen die aan een bepaalde voorwaarde voldoen namelijk dat men bij een percentage van het eerste het tweede getal bekomt met verschuiving van de 2 van voor naar achter.
-klopt die formule : De eerste twee uitgewerkte voorbeelden geven aan dat de volgorde XY en YX kloppen en dat dus de formule juist is. Als ik met een rekenmachine alle jaartallen bereken dan kloppen ze allemaal.
Bereken met een eenvoudig getal maar eens Y * (5500000-100) = (1000-55)X
dus 10999800Y = 945 X dus X is 11640. Y is 2 dus YX is 211640 en XY is 55% daarvan of 116402

Ik hoop dat hiermee al je vragen beantwoord zijn ?

  • Ben(V)
  • Registratie: december 2013
  • Nu online
Ik weet niet wat je precies doet, misschien moet je de code hier eens plaatsen maar bij mij komt er altijd dit uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
('Het gevraagde getal YX is:', 2066115702479338842975L)
('Het gevraagde getal YX *', 32, ' % is getal XY :', 661157024793388429752L)

('Het gevraagde getal YX is:', 2066115702479338842975L)
('Het gevraagde getal YX *', 32, ' % is getal XY :', 661157024793388429752L)

('Het gevraagde getal YX is:', 2066115702479338842975L)
('Het gevraagde getal YX *', 32, ' % is getal XY :', 661157024793388429752L)

('Het gevraagde getal YX is:', 2066115702479338842975L)
('Het gevraagde getal YX *', 32, ' % is getal XY :', 661157024793388429752L)

('Het gevraagde getal YX is:', 2066115702479338842975L)
('Het gevraagde getal YX *', 32, ' % is getal XY :', 661157024793388429752L)

[Voor 16% gewijzigd door Ben(V) op 08-07-2020 12:59]

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
@ Ben(V)

dit is hetgeen ik gebruikt heb :

Y = 2
jaar = 32
nul = 21
teller = Y * ( jaar * pow(10, nul) - 100 )
noemer = (1000 - jaar)
print("Het gevraagde getal YX is:", (( Y * pow(10, nul))) + (int (teller // noemer )))
print("Het gevraagde getal YX *", jaar, " % is getal XY :", (int((( Y * pow(10, nul)) + (int(teller / noemer))) * jaar/100 )))

of bedoel je iets anders met "de code" en waar vindt ik die dan ?

  • Ben(V)
  • Registratie: december 2013
  • Nu online
Dit is de code waar ik het resultaat van geplaatst heb.
Zoals je ziet gewoon een copy and paste van wat jij schreef dus als je andere uitkomsten krijgt dan moet er iets anders in je code staan.

Python:
1
2
3
4
5
6
7
Y = 2
jaar = 32
nul = 21
teller = Y * ( jaar * pow(10, nul) - 100 )
noemer = (1000 - jaar)
print("Het gevraagde getal YX is:", (( Y * pow(10, nul))) + (int (teller // noemer )))
print("Het gevraagde getal YX *", jaar, " % is getal XY :", (int((( Y * pow(10, nul)) + (int(teller / noemer))) * jaar/100 )))

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


  • KabouterSuper
  • Registratie: september 2005
  • Niet online
Ik heb de code ook gecopy-past (Python 3.6.8 64bit) en krijg:
code:
1
2
Het gevraagde getal YX is: 2066115702479338842975
Het gevraagde getal YX * 32  procent is getal XY : 661157024793388384256


Update: waarom gebruik je teller//noemer in XY en niet teller/noemer (zoals je doet in YX)?

Update 2: ik vermoed dat je niet netjes rekening houdt met je type omdat je integer-delingen doet, waardoor je afrondingen ziet (of beter gezegd: niet ziet).

Als ik (( Y * pow(10, nul))) + ( (teller / noemer )) doe, kom ik met integers uit op
2066115702479338842975
maar doe ik hetzelfde met floats, dan kom ik uit op
2066115702479338786432

[Voor 54% gewijzigd door KabouterSuper op 08-07-2020 14:25]


  • Ben(V)
  • Registratie: december 2013
  • Nu online
Het is uiteraard een heel slecht opgezette berekening die last krijgt van afrondings verschijnselen.
Dat er verschillende uitkomsten zijn komt door de verschillende platformen
Ik heb bijvoorbeeld 64bits python 2 op windows gebruikt.

Maar dat is verklaarbaar, echter TS stelt dat zijn programma bij een tweede run een andere uitkomst geeft en dat zou heel vreemd zijn.

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
@ Ben(V)
Nee , dat is verkeerd begrepen.
Hoeveel runs ik ook doe de uitkomst is altijd dezelfde :

Het gevraagde getal YX is: 2066115702479338842975
Het gevraagde getal YX * 32 % is getal XY : 661157024793388384256
>>>
= RESTART: /
Het gevraagde getal YX is: 2066115702479338842975
Het gevraagde getal YX * 32 % is getal XY : 661157024793388384256

dus die oplossing komt niet overeen met het gevraagde.

maar als ik de formule handmatig bereken kom ik tot het juiste resultaat :
2066115702479338842975 * 32 % = 661157024793388429752 (tot deze oplossing komt Ben(V) ook)
dus de fout moet volgens mij ergens in het tweede gedeelte van die code zitten.

Ik gebruik python 3.8.3 op een iMac met macOS.
Het zal waarschijnlijk ergens in die delingen zitten ( in versie 2 is / gelijk aan // in versie 3 blijkbaar)
en in afrondingen en integers maar na enkele weken ben ik nog niet zo goed dat ik er die uit kan halen.
Ik heb ook al geprobeerd de vermelding (int) en / en // te vervangen maar ik kom nooit tot het juiste resultaat.

Ik heb nog even de berekening handmatig gedaan :
Y * (32000000000000000000000 - 100) = (1000 - 32) X
Y * (31999999999999999999900) = (968)X
(63999999999999999999800) = (968)X
X = (63999999999999999999800/968
X = 66115702479338842975
dus de oplossing zou zijn :YX = 266115702479338842975 en XY = 661157024793388429752
maar daar zit dus een foutje in dat python misschien niet kan zien denk ik want er is na de 2 van YX een voorloopnul nodig in dit geval om de rekening te laten kloppen.
want 266115702479338842975 x 32 % = 85157024793388429752 en dus fout
De juiste oplossing is 2066115702479338842975 x 32% = 661157024793388429752

Maar in de berekening van Ben(V) geeft python blijkbaar wel een goed antwoord,maar hoe lukt dat in mijn versie.

[Voor 28% gewijzigd door 1993scarlet op 08-07-2020 16:47]


  • KabouterSuper
  • Registratie: september 2005
  • Niet online
1993scarlet schreef op woensdag 8 juli 2020 @ 15:00:
@ Ben(V)
Maar in de berekening van Ben(V) geeft python blijkbaar wel een goed antwoord,maar hoe lukt dat in mijn versie.
Je kunt in plaats van int's Decimals gebruiken. Dat lost je probleem denk ik op:
Python:
1
2
3
4
5
6
7
8
9
10
from decimal import Decimal

Y = 2
jaar = 32
nul = 21
teller = Decimal(Y * ( jaar * pow(10, nul) - 100 ))
noemer = Decimal(1000 - jaar)

print("Het gevraagde getal YX is:", (( Y * pow(10, nul))) + (Decimal(teller / noemer )))
print("Het gevraagde getal YX *", jaar, " % is getal XY :", (Decimal((( Y * pow(10, nul)) + (Decimal(teller / noemer))) * jaar/100 )))

Acties:
  • +1Henk 'm!

  • GlowMouse
  • Registratie: november 2002
  • Niet online

GlowMouse

wees solidair

Als je het goede en het foute antwoord vergelijkt:
code:
1
2
661157024793388384256
661157024793388429752

zie je dat het verschil optreedt in het zestiende cijfer. Dat komt omdat de berekening wordt uitgevoerd met floatingpointgetallen die een precisie hebben van 15 tot 17 significante cijfers ("The 53-bit significand precision gives from 15 to 17 significant decimal digits precision").

In Python 3 worden integers altijd met oneindige precisie opgeslagen, maar zodra er een floatingpointgetal aan te pas komt (zoals bij "teller / noemer") raak je de precisie kwijt. Er zijn twee oplossingen. De eerste is Decimal gebruiken zoals KabouterSuper zegt. De andere oplossing is door // te gebruiken in plaats van /, maar dan moet je wel opletten dat de uitkomst altijd geheeltallig is want anders raak je informatie kwijt (bv 3//2 = 1):
code:
1
2
3
4
XY = Y * pow(10, nul) + teller // noemer
XY_frac = XY * jaar // 100
print("Het gevraagde getal YX is:", XY)
print("Het gevraagde getal YX *", jaar, " % is getal XY :", XY_frac)

[Voor 9% gewijzigd door GlowMouse op 08-07-2020 17:26]

geeft geen inhoudelijke reacties meer


Acties:
  • +1Henk 'm!

  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
@ KabouterSuper & Glowmouse

Geweldig, het werkt met decimal.

Het gevraagde getal YX is: 2066115702479338842975
Het gevraagde getal YX * 32 % is getal XY : 661157024793388429752

Al ben ik een heel eind in de zeventig , bijleren geeft altijd weer een prettg gevoel.

Heel hartelijk bedankt aan iedereen die geholpen heeft.

  • KabouterSuper
  • Registratie: september 2005
  • Niet online
1993scarlet schreef op woensdag 8 juli 2020 @ 18:16:
@ KabouterSuper & Glowmouse

Geweldig, het werkt met decimal.

Het gevraagde getal YX is: 2066115702479338842975
Het gevraagde getal YX * 32 % is getal XY : 661157024793388429752

Al ben ik een heel eind in de zeventig , bijleren geeft altijd weer een prettg gevoel.

Heel hartelijk bedankt aan iedereen die geholpen heeft.
Haha, aan je nickname te zien voel je je nog 27! Uit interesse, wat is de achtergrond van het probleem? Ik ben wiskundige, dus ik ben eigenlijk wel benieuwd.

  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
@ KabouterSuper

Die 1993 laat wel meer mensen denken dat het mijn geboortejaar is .
Soms wil je dat wel want er is nog zoveel bij te leren in je leven maar aan de andere kant ben ik best tevreden met mijn echte leeftijd.
De achtergrond van het probleem ( ik zou het wel geen probleem noemen ).
Een vriend vroeg me eens een puzzel op te lossen waarbij je dus uitgaande van je geboortejaar en een voorloopgetal , bv 2 ( maar soms kan het ook met 4 of een ander getal ) je twee getallen kreeg waarbij je met het percentage van je geboortejaar toe te passen op het ene getal het andere bekwam met dat voorloopgetal achteraan.
Het was wel een beetje een gemene opdracht want ik kwam er achter dat ik voor mijn geboortejaar een getal moest krijgen van 952 cijfers.
Handmatig zit je daar natuurlijk dagen aan te werken met een online bigintegercalculator maar ik vond een erg hulpvaardige man die goed thuis was in de computertaal Python en die maakte me een lijstje van jaar 00 tot 99 met daarachter het aantal nullen dat ik in de formule moest gebruiken. Met dat gegeven erbij was het vrij eenvoudig en snel om het getal uit te rekenen.
Die brave man wekte hierbij ook mijn belangstelling om eens uit te puzzelen wat je zo nog meer kon met python en zodoende ben ik enkele weken geleden begonnen met uit een onlineboek de eerste stappen te leren. Om wat met die eerste indrukken te oefenen probeerde ik dus de formule van dat raadsel eens om te zetten in pythontaal. Dat lukte voor de kleinere getallen wel maar mijn kennis is nog teveel beperkt om te weten dat je met integers en decimalen moet uitkijken. En dat heb ik nu dus weer bijgeleerd.

Voor een wiskundige zal het allemaal natuurlijk heel eenvoudig klinken maar gelukkig helpen die wiskundigen ook anderen aan de oplossing van zo'n eenvoudig "probleempje".

  • KabouterSuper
  • Registratie: september 2005
  • Niet online
1993scarlet schreef op woensdag 8 juli 2020 @ 19:07:
@ KabouterSuper

Het was wel een beetje een gemene opdracht want ik kwam er achter dat ik voor mijn geboortejaar een getal moest krijgen van 952 cijfers.
Dan weet ik in welk jaar je geboren bent :9 . Mijn getal is 3 cijfers.
1993scarlet schreef op woensdag 8 juli 2020 @ 19:07:
Voor een wiskundige zal het allemaal natuurlijk heel eenvoudig klinken maar gelukkig helpen die wiskundigen ook anderen aan de oplossing van zo'n eenvoudig "probleempje".
Ach, iedereen die een vak geleerd heeft, zal er goed in zijn. Ik ben blij dat ik je kon helpen. Het is wel een grappige puzzel trouwens. Ik heb er even aan gerekend, en het is niet zo duidelijk waarom dit altijd kan (priemgetallen blijven mysterieus).
Mocht je overigens 'last' hebben van de E-notatie bij grote getallen (bijv 1.2345E+21), dan kan je de precisie aanpassen met (die 100 is de nieuwe precisie)
Python:
1
2
from decimal import getcontext
getcontext().prec = 100

  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
Goeiemorgen KabouterSuper,

alweer iets bijgeleerd . Die E-notatie komt inderdaad regelmatig voor.

En die leeftijden ,toch prettig als je met wiskunde en (priem)getallen kan spelen.

Nog één ( misschien dom) vraagje :
Als ik programmagegevens in zo'n topic zet of run dan zie ik enkel maar de gegevens.
Als jullie hetzelfde doen dan zie ik vooraan altijd een kolom met de nummering van de lijnen en dat lijkt me wel handig.
Kan ik ergens in python aanpassen om ook die nummering te zien te krijgen ?

Dank bij voorbaat 🤝

  • Ben(V)
  • Registratie: december 2013
  • Nu online
Je moet dan beginnen met het woord code tussen blokhaken en afsluiten met het /code tussen blokhaken

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
Bedankt Ben(V) , maar er loopt blijkbaar iets mis want ik krijg de melding "invalid syntax"

Zie hierbij hoe ik het gedaan heb :


code:
1
2
3
4
5
6
7
8
9
10
from decimal import Decimal

Y = 2
jaar = 32
nul = 21
teller = Decimal(Y * ( jaar * pow(10, nul) - 100 ))
noemer = Decimal(1000 - jaar)

print("Het gevraagde getal YX is:", (( Y * pow(10, nul))) + (Decimal(teller / noemer )))
print("Het gevraagde getal YX *", jaar, " % is getal XY :", (Decimal((( Y * pow(10, nul)) + (Decimal(teller / noemer))) * jaar/100 )))

  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
@ Ben (V)

Vervolg van mijn antwoord.
Ik zie nu dat die nummering wel in mijn reactie verschijnt. Dus het lijkt wel te werken.
Maar ik dacht dat die nummering misschien ook na "run" in IDLE zou staan , maar dat blijkt dus niet te zijn.
Dat zou interessant zijn want soms geeft men op dat er een fout zit in "line xx "

  • KabouterSuper
  • Registratie: september 2005
  • Niet online
1993scarlet schreef op donderdag 9 juli 2020 @ 10:55:
@ Ben (V)

Vervolg van mijn antwoord.
Ik zie nu dat die nummering wel in mijn reactie verschijnt. Dus het lijkt wel te werken.
Maar ik dacht dat die nummering misschien ook na "run" in IDLE zou staan , maar dat blijkt dus niet te zijn.
Dat zou interessant zijn want soms geeft men op dat er een fout zit in "line xx "
Vanaf versie 3.8 kunnen regelnummers in IDLE getoond worden. Voor oudere versies wordt dit nog niet ondersteund. In de rechteronderhoek staat het regelnummer en met ALT+G kan je naar een regelnummer springen.

  • 1993scarlet
  • Registratie: juni 2020
  • Laatst online: 04-06 16:01
@ KabouterSuper & Ben(V)

Ik heb 3.8.3 en in de rechteronderhoek van het IDLE venster staan inderdaad de lijnnummers.

via menu/options/show line numbers kan je die nummers ook éénmalig voor de coderegels laten verschijnen.

Eenvoudiger nog. Via preferences/general/show line numbers aan te vinken komen de lijnnummers permanent in al je vensters staan.

🤝
Pagina: 1


Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True