← RU Pythoncursus

Inlever opgave

Wij zijn allemaal gewend te tellen met het 10-tallig stelsel (engels: counting in base 10). Hier zijn allerlei verklaringen voor bedacht, maar wiskundig gezien is hier geen reden voor (historisch ook niet, in het oude Babylon telde men in een 60-tallig stelsel). In deze opgave gaan we een programma schrijven dat een getal uit het 10-tallig stelsel omzet naar een ander stelsel. In basis $b$ schrijf je op hoevaak je welke machten van $b$ moet optellen om een getal te krijgen.

Als voorbeeld, het decimale getal 11 in andere basissen:

In basis 2: $11 = 1\cdot 8 + 0\cdot 4 + 1\cdot 2 + 1\cdot 1$, dus 11 wordt geschreven als 1011.

In basis 3: $11 = 1\cdot 9 + 0\cdot 3 + 2\cdot 1$, dus 11 wordt geschreven als 102.

In basis 4: $11 = 2\cdot 4 + 3\cdot 1$, dus 11 wordt geschreven als 23.

In basis 7: $11 = 1\cdot 7 + 4\cdot 1$, dus 11 wordt geschreven als 14.

  1. Schrijf eerst een stukje code dat twee gehele getallen inleest, eerst het getal dat moet worden omgezet (een positief geheel getal), dan het nieuwe basis getal (een geheel getal tussen de 2 en de 10). Je hoeft de invoer niet te controleren, maar dat mag je als extra uitdaging natuurlijk altijd doen.

In het vervolg zullen we het getal dat moet worden omgezet $n$ en het nieuwe basisgetal $b$ noemen. De meest intuitieve manier om dit probleem aan te pakken is door het getal van links naar rechts op te bouwen (als je een ander idee hebt, werkt dat vooral uit!).

  1. Schrijf een loop die uitrekent wat de grootste macht van $b$ is die nog kleiner is dan $n$. Voor $n = 11$ en $b = 2$ is dit bijvoorbeeld $2^3 = 8$, voor $n = 11$ en $b = 7$ is dit $7^1 = 7$.
  2. Vind met behulp van de quotient operator // het eerste cijfer van $n$ in basis $b$. Met // kan je uitrekenen hoe vaak de gevonden macht van $b$ in $n$ past: n // (b**k) als $k$ de gevonden macht is. Bijvoorbeeld 11 // 4 geeft de waarde 2.

Dit geeft het eerste cijfer van de notatie van $n$ in basis $b$. Nu willen we natuurlijk de volgende cijfers vinden. Dit kan bijvoorbeeld met een for loop die aftelt over de machten van $b$:

# lees het getal en nieuwe basisgetal in

# bepaal de grootste macht die voor kan komen

nieuw_getal = ""
for macht in range(grootste_macht, 0, -1):
	# bepaal het cijfer dat bij b**macht hoort`
	
	# update n (volgende ronde willen we alleen nog het gedeelte van n
	# hebben dat bij kleinere machten hoort, dit kan je bijvoorbeeld met de
	# modulo operator doen.)
	
	# voeg het cijfer toe aan de string nieuw_getal, denk aan de functie
	# str() die van een getal een string kan maken.

Als het bovenstaande nog te vaag is, hier een getallen voorbeeld met $n = 11$ en $b = 3$.

De grootste macht is 2, want $3^3 = 27$ is groter dan 11. Hoe vaak komt $3^2$ voor in 11? Dat is $11 = 1\cdot9 + 2$ (dus 1 is het quotient en 2 is de rest of de modulo). Het eerste cijfer hier is dus 1.

We gaan door met de rest en de volgende macht, dus 2 en $3^1$.

Hoe vaak komt $3^1$ voor in 2? Dat is $2 = 0\cdot3 + 2$ (dus 0 is het quotient en 2 is weer de rest). Het volgende cijfer is dus 0.

We gaan door met de rest en de volgende macht, dus 2 en $3^0$.

Hoe vaak komt $3^0$ voor in 2? Dat is $2 = 2\cdot1 + 0$ (dus 2 is het quotient en 0 is de rest). Het cijfer hier is dus 2. Het totale cijfer is dus “102”.

  1. Werk de voorbeelden hierboven uit tot werkende python code met als eindresultaat een string met het nieuwe getal. Het mogen gerust meerdere regels code zijn per regel commentaar! Vergeet niet het eindresultaat netjes te printen.