Soultaker's how-to-program les 1: bedenk eerst hoe je het probleem handmatig zou oplossen!
Waarschijnlijk wil je alle cijfers in het getal afgaan (
itereren over de cijfers in het getal) en ze één voor één vergelijken met het gezochte cijfer. Je kunt zo vrij makkelijk het aantal gezochte cijfers tellen.
Zoals drago al aangeeft is dat vrij makkelijk als je het getal omzet naar een string, zodat het getal feitelijk gerepresenteerd wordt door een reeks van karakters. Die afzonderlijke karakters zijn weer als cijfers te interpreteren en dan kun je ze vergelijken. Een implementatie van dat algoritme zou er als volgt uitzien:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
int getal = 123434;
int cijfer = 4;
int gevonden = 0;
ostringstream ss;
ss << getal;
const string str = ss.str();
for(string::const_iterator i = str.begin(); i != str.end(); ++i)
if((*i - '0') == cijfer)
++gevonden;
cout << gevonden << std::endl;
} |
Op zich is dit een correcte implementatie, maar het is nogal een gedoe, omdat je zowel met int's, strings en characters werkt. De expressie (*i - '0') is bijvoorbeeld nodig om een character (zoals '1') om te zetten naar een int (zoals 1). De getalwaarde van character '1' is namelijk iets heel anders dan 1.
Het is dus waarschijnlijk handig om iets verder door te denken, zodat je die strings en characters niet nodig hebt. Je implementatie wordt dan veel efficiënter omdat je geen conversies meer hoeft uit te voeren en het wordt er ook nog leesbaarder op.
Wat je wilt bereiken, is dat je alle cijfers in je invoergetal één voor één kunt beschouwen. In welke volgorde je ze beschouwt maakt echter niet uit! En daar komt het verhaal met "modulo 10" om de hoek kijken. Als je een geheel getal als "12345" deelt door 10, dan is het resultaat een geheel getal "1234" (er wordt altijd omlaag afgerond!) en de rest "5" (basisschoolkennis). De modulus operator levert je de rest op; dat is het hele verhaal. 12345/10 is dus 1234, en 12345%10 is 5. Hier valt direct op, dat (x%10) het laatste cijfer van het getal oplevert, en (x/10) het getal dat bestaat uit de overige cijfers! Als je dus steeds met de modulus het laatste cijfer bekijkt en met de deling het laatste cijfer van het overgebleven getal afhaalt, dan kun je alle cijfers dus een voor een langsgaan.
De implementatie hiervan mag je zelf verzinnen; als het goed is wordt het een simpele for- of while-lus van een regel of 3. Denk eraan dat je moet stoppen wanneer het resterende getal 0 is geworden.
edit:
Hmm, ik zie dat er al allerlei voorgekauwde uitwerkingen staan. Beetje jammer, als het zo duidelijk om een huiswerkopgave gaat.
[
Voor 10% gewijzigd door
Soultaker op 07-09-2003 17:19
]