Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

11

28.03.2012, 14:03

Du musst dir vorstellen, dass beide zahlen circa 100 Stellen und nochmal 50 nachKommastellen haben und dabei wüsste ich wirklich keine Idee,
wie ich diese so einfach mit einander dividieren könnte :P
deshalb bin ich ja auf die ausweis idee gekommen...

zb bei 1.256.748 durch 120 würde es ja noch funktionieren aber bei 1.235.637.547.634 durch 123.123.345.23.567 geht das nicht mehr ja ich ja dabei gar nicht mehr testen kann,
wie oft die eine in die andere macht, so wie man es ja mal zu Hrundschulzeiten gelernt hat!
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

28.03.2012, 14:37

Mach es so, wie du es in der Schule gelernt hast.
Schriftliche Division. Das geht in ca. 5 Zeilen Code.

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

13

28.03.2012, 14:44

Hää... ich hab doch grad gezeigt, wieso das nicht funktioniert... hier ich poste mal die klasse und den operator + dann seht ihr wie ich das meine:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class BigNumber
{
private:
    vector<int>             vDaten; // Zahlenziffern
    vector<int>::iterator   Iter;   // Iterator
    int                     NachKommaStellen; // 
    bool                    bPositive;

public:

    // Konstruktoren
    BigNumber (vector<int> vDatenIn, bool bPositiveIn = true);
    BigNumber (int i[], int iSize, bool bPositiveIn = true);
    BigNumber (int x, bool bPositiveIn = true);

    // Funktionen
    void ShowData (); // Daten anzeigen

    // inline-Funktionen
    vector<int> GetvDaten (){return vDaten;};
    vector<int>::iterator GetIterator (){return Iter;};

    // Operatoren
    void operator=      (BigNumber &BNIn)       {vDaten = BNIn.GetvDaten();};
    bool operator==     (BigNumber &BNEqualIn);
    bool operator==     (vector<int> &vEqualIn);

    void operator+=     (int iSumandIn);
    void operator+=     (BigNumber &BNSumandIn);
    void operator*=     (int iFactorIn);
    void operator*=     (BigNumber &BNFactorIn);
};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
vector<int> operator+ (BigNumber &BGSumandInF, BigNumber &BNSumandIn)
{
    vector<int> vÜbertrag;
    vector<int> vSum;

    vÜbertrag.push_back (0);
    int Temp = 0;

    for (int x=0; vÜbertrag[static_cast<int>(vÜbertrag.size ())-1] != 0 || x<static_cast<int>(BGSumandInF.GetvDaten().size ()) || x<static_cast<int>(BNSumandIn.GetvDaten().size()); x++)
    {
        
        if(x < static_cast<int>(BGSumandInF.GetvDaten().size()))
        {
            Temp += BGSumandInF.GetvDaten()[x];
        }
        
        if(x < static_cast<int>(BNSumandIn.GetvDaten().size()))
        {
            Temp += BNSumandIn.GetvDaten()[x];
        }

        if(x < static_cast<int>(vÜbertrag.size()))
        {
            Temp += vÜbertrag[x];
        }

        if(x == static_cast<int>(vSum.size ()))
        {
            vSum.push_back (Temp%10);
        }
        else
        {
            vSum[x] = Temp%10;
        }

        if((Temp - (Temp%10))/10 > 0)
            vÜbertrag.push_back((Temp - (Temp%10))/10);
        else
            vÜbertrag.push_back (0);
        
        Temp = 0;
    }

    return vSum;
};


das is jetzt um 2 bigNumber zu addieren:
Und weil ich das ja so mache, weiß ich wirklich nicht, wie ich das mit dem normalen Schulweg lösen soll!

wenn du denkst, das klappt, poste mal diese 5 Zeilen, bitte
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

14

28.03.2012, 14:49

Du wolltest doch nur 1/x berechnen.
Wieso funktioniert denn da eine schriftliche Division nicht?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

15

28.03.2012, 14:54

ich hatte schonmal in C# eine Klasse für beliebig große Zahlen geschrieben, welche mit einer Zeichenkette arbeitete (und somit noch Zeichenkettenoperationen zur eigentlichen Berechnung dazu kam)

sofern du das nur zu Übungszwecken machst:
eine Division vergleichbar zu der, die man in der Schule gelernt hat (schriftliche division) funktioniert, ich habe es in meinem Fall auch so gemacht

solltest du vor haben, das tatsächlich einzusetzen:
greife lieber auf vorhandene Implementierungen, wie GMP zurück
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

28.03.2012, 14:54

Also ich würde mal meinen dass es sehr viel sinnvoller wäre, die Division direkt zu implementieren und nicht über eine multiplikative Inverse. Allein schon was die Effizienz anbelangt...

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

17

28.03.2012, 14:56

Also die Operatorüberladung ist ja schonmal seltsam:
Weshalb keine "BigNumber" als Rückgabewert?

Ansonsten kannst du es natürlich so wie in der Schule machen.
Ist aber wahrscheinlich nicht optimal.

Wenn du auch eine Fertiglösung akzeptierst, könnte GMP weiterhelfen.

EDIT: Da waren wohl wieder einige schneller. :rolleyes:

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

18

28.03.2012, 15:28

C-/C++-Quelltext

1
2
3
4
5
int result = 0;
foreach(Zahl in Vector)
{
   result += 1/Zahl;
}


Angenommen das Zahl immer != 0 ist.

Was soll denn das bitte berechnen?
Garantiert nicht 1/x.
Ganz zu schweigen davon, dass das eine Integer-Division ist und result auch ein Integer.
Wie soll für x > 1 ein Integer 1/x sein?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

28.03.2012, 18:52

David, manchmal schweigt und genießt man nur ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

20

29.03.2012, 09:00

also wenn ich das so machen würde, wie ich es in der Schule gelernt hab wäre das ja so:
1. Testen wie oft der divisor in die letzte ziffer des difidenten passt
2. wenn nicht, vorletzte Ziffer noch mitnehmen
3. wenn, den Teiler ins ergebnis eintragen.

So jetzt 2 sachen die dabei nicht funktionieren:
1. wie soll ich testen, wie oft der divisor darein passt, denn das is ja schon eine Division^^
Man könnte hÖchstens den Divisor so oft von Divident abziehen, bis er kleiner is als der divisor
nur das würde bestimmt übelst leistungsschwach sein!
2. hab ich grad irgendwie vergessen, aber ich glaub das 1. Argument is so oder so einleuchtend!

So und dabei würde es doch viel einfacher mit der Inversen zu Multiplizieren.
Ich konnte eine Funktion für dir inverse schreiben und dann einfach damit Multiplizieren.

Nur is jetzt die Frage wie ich das am besten mache!
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Werbeanzeige