Ville lige dele noget indsigt om C som jeg lige har "genindset".
Jeg sad og kiggede på Project Euler og problem 5 og sad og lavede en løsning
i C, nærmere specific C89. Jeg vidste godt at C havde begrænsede tal, noget man godt kan glemme i de fleste sprog fordi de har typisk en BigInt-agtigt type som bruger de samme operator som andre tal. C89 garanterer kun 4 bytes til en int og det begrænset tallet til for den 'signed' værdi til lidt over 2 milliarder. Men tænkte ikke så meget over det da jeg mente (gættede) at resultat kunne være indenfor dette. Det kunne det sådan set også, men det sidste mellemresultat i min algoritme sendte den op over grænsen.
Hvilke muligheder havde jeg?
1. Først tænkte jeg at på unsigned og større datatype. Men unsigned løser ikke disse problemer for fremtidige tal og en der er ikke garanteret en større datatype i C89. Så skulle jeg skifte til C90 i stedet men problemet ville blot opstå senere.
3. Løsning 3 var at lave algoritmen om og bruge primfaktorer eller lignende i stedet for de store tal, men syntes det ville besværligt og så skulle det gøres i alle fremtidige euler problemer i samme situation.
2. Den anden løsning var at bruge en type der kunne holde større værdier, "uendelige" værdier, en såkaldt BigInt type. Men så skulle alle mine generelle algoritmer laves igen til den nye type fordi +operatoren ikke opererer på typer som ikke er indbygget. Alternativ kunne det løses med noget makrohelvede hvor man definerede om man brugte indbygget eller en BigInt men det lød heller ikke særlig tiltrækkende. Der vidst også noget med at en 'double' kan gemme flere bits (53 ?) og man faktisk godt kan bruge den til heltalsberegninger, men igen samme problem med et begrænset antal bits.
Alle de ting vidste jeg sådan set godt, men der er vidst også et udtryk der lyder at man først lærer noget ordentligt når man er blevet straffet for sine fejl, og det er jeg nu blevet. Jeg har altid syntes at C var et flot sprog og at C++ har jeg ikke kigget så meget på men idéerne så fine ud men syntes at det nu nok kunne gøres i C alligevel. Det kan også gøres i C med det er mere bøvlet. Efter hvad jeg har set om C++ ville det være meget simplere der fordi der understøttes vidst nok generiske typer og algoritmer samt operator overloading. Så jeg kunne både bruge tal og BigInt uden at ændre i algoritmen eller andet endt blot typen faktisk. Så min 'gcd' funktion kunne se sådan her ud i pseudokode:
- T gcd(T a, T b) {
- T temp;
- if (b > a)
- return gcd(b, a);
- while (b != 0) {
- temp = b;
- b = a % b;
- a = temp;
- }
- return a;
- }
Hvor den før var med 'int' i stedet for T. Som sagt det er bare mit gæt men kan nogen med viden om C++ fortælle om det faktisk er sådan at man kan gøre det?
Mit råd er at dem som overvejer at lave noget i C først skal overveje om der er plads til tallene, og hvis der er 1% chance for at et tal ikke kan være i de indbyggede typer så begynd allerede der at overveje hvordan tal og algoritmer skal håndteres. Men at planlægge tingene på forhånd er vel egentaget basisviden som jeg glemte at tage i betragtning.
Nogen der har nogle forslag til hvordan man ellers kan "angribe" tal i C?
Ha' en fortsat god dag
Indlæg senest redigeret d. 31.07.2011 14:49 af Bruger #14645