Avatar billede ferret Nybegynder
21. oktober 2003 - 00:53 Der er 9 kommentarer og
1 løsning

Store tal

Først og fremmest - undskyld for den ikke så gode titel, men jeg kunne ikke komme på noget bedre.

Og nu til mit spørgsmål:

Jeg har skrevet dette program

#include <iostream>
using namespace std;
int main (int argc, const char * argv[]) {
    int i = 1;
    int c = 0;
    char ch ='n';
    unsigned int n1 = 1;
    unsigned int n2 = 0;
    unsigned int nc = 1;
    float ratio = 0.0;
   
    cout<<"Fibbonachi number generator."<<endl<<"How many numbers to generate? ";
    cin>>c;
    if(c>47){
        cout<<c<<" is too large a value, defaulting to 45."<<endl<<" Continue?(y/n)";
        cin>>ch;
        if((ch == 'n') || (ch == 'N')){
            cout<<"Exiting..."<<endl;
            return 0;}
        else
            c = 45;
        }
   
    while(i<=c){
            nc = n1 + n2;
            ratio = (float)nc / (float)n2;
            cout<<i<<". "<<nc<<" | Ratio: "<<nc<<" / "<<n2<<" = "<<ratio<<endl;
            n1 = n2;
            n2 = nc;
            i++;
            }

    return 0;
}

Det er til udregning af fibbonachi (Stavning?) tal, og det virker fint men, som i kan se har jeg en lille del af programmet der stopper c variablen fra at blive større en 47, den har  jeg fordi hvis tallet bliver større end 47 bliver tallet i nc variablen størren end hvad der kan være i en unsigned int, mit spørgsmål er nu - er der en måde hvor man kan 'bygge' store tal? Altså tal der i teorien kan være så store som man har lyst til? Min plan med programmet var nemmelig at lave det om til en function hvar man kan finde n'te tal i fibbonachi sekvensen, altså noget ala fibbo(n), sådan så man kan regne med dem, min plan var at bruge del til seeding af tilfældigheds generatorer og sådan. Og før i siger noget jeg ved de også er begrænset af tal størrelsen.
Noget idelt var hvis det kunne være en klasse, som har overloadede operatorer i hvert fald +,-,*, /,% og =, må også gerne understytte +=, -=, ++ og --.

Links er gyldige svar, gerne nogen hvor koden der henvises til forklares. Og så en ting mere - det skal helst være OS uafhængigt. Eller i det mindste kunne compiles på Mac OSX og Win2k.

På forhånd tak.
Avatar billede soreno Praktikant
21. oktober 2003 - 06:50 #1
Prøv at brug en
unsigned int c;

istedet for.

Eller en
unsigned long long c;

(En long long er 64 bit. Men jeg ved ikke om den virker med alle compilere)
Avatar billede soreno Praktikant
21. oktober 2003 - 07:02 #2
Denne kan (umiddelbart til 93):

#include <iostream>
using namespace std;
int main (int argc, const char * argv[]) {
    int i = 1;
    unsigned long long c = 0;
    char ch ='n';
    unsigned long long n1 = 1;
    unsigned long long n2 = 0;
    unsigned long long nc = 1;
    float ratio = 0.0;
   
    c = 93;
 
    while(i<=c){
            nc = n1 + n2;
            ratio = (float)nc / (float)n2;
            cout<<i<<". "<<nc<< endl;//" | Ratio: "<<nc<<" / "<<n2<<" = "<<ratio<<endl;
            n1 = n2;
            n2 = nc;
            i++;
            }

    return 0;
}

(Jeg tør ikke garantere for tal over 93 - tallene begyndte at opføre sig underligt. Jeg har ikke lige tid til at kigge på det nu, hvis du ikke har fået svar inden jeg kigger ind i igen skal jeg nok kigge på det.)
Avatar billede soreno Praktikant
21. oktober 2003 - 07:31 #3
Hvis du vil lave noget helt generelt så søg lidt på
c++ big integer

F.eks.
http://www.geocities.com/acmbeganer/bignum.htm
Avatar billede arne_v Ekspert
21. oktober 2003 - 10:07 #4
long long int eller __int64 (evt. i unsigned) virker nok i det fleste
compilere idag.

Skal du højere op skal du have fat i en BigInteger klasse.

Dem er der skrevet masser af.

Jeg har skrevet noget kode der ligger her:

http://www.vajhoej.dk/arne/eksperten/big/

Men andre pakker er sikkert bedre.

Der var bl.a. en klasse i gode gamle libg++ !
Avatar billede ferret Nybegynder
21. oktober 2003 - 16:53 #5
Jeg besluttede mig for at bruge long long metoden, så pointene går til soreno, hvis bare han vil ligge et svar.
Avatar billede ferret Nybegynder
21. oktober 2003 - 16:55 #6
Og jeg kan konstatere at hvis man genererer mere end 93 tal med long long falder det sammen, en måde at de det på er ar ratio skal være næsten phi, altså 1.6....
Avatar billede soreno Praktikant
21. oktober 2003 - 16:56 #7
Jamen, det gør jeg så.
Avatar billede soreno Praktikant
21. oktober 2003 - 22:37 #8
Jeg sad lige og legede lidt med det.

2^64 giver mulighed for at repræsentere [0-18446744073709551615] tal.

Det 94. fibonacci tal er 93. + 92. =
12200160415121876738  +
7540113804746346429

Hvilket giver:
19740274219868223167

Det kan ikke repræsenteres da tallet er større end 2^64

Hvis du er til Java så lavede jeg lige dette program som regner med vilkårlig store tal:
import java.math.*;

public class Main
{
    public static void main(String args[])
    {
        BigInteger n;
        BigInteger p = new BigInteger("1");
        BigInteger q = new BigInteger("0");
       
        for(int i=1;i<=100;i++)
        {
            n = p.add(q);
            System.out.println("[" + i + "] " + n);
            p = new BigInteger(q.toString());
            q = new BigInteger(n.toString());           
        }
    }
}
Avatar billede ferret Nybegynder
21. oktober 2003 - 23:16 #9
Jeg er desvære ikke en java mand, jeg er kun til c++ på amatør niveau.
Avatar billede arne_v Ekspert
21. oktober 2003 - 23:21 #10
Der finde masser af C++ biblioteker som leverer samme funktionalitet.

2 links ovenfor.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester