Seite 1 von 1

[gelöst] schriftliche Addition von 2 Zahlen im QString

Verfasst: 26. Mai 2010 22:07
von 24dan
Hallo ich habe mir eine Funktion zur Schriftlichen Addition geschrieben.
Hat jemand eine Tip ob man das auch noch schneller hinbekommt?
PS: Es müssen die Zahlen 1 und 2 als QString eingegeben werden da die einfach über den größt möglichen Datentyp hinausreichen.

Code: Alles auswählen

QString TEIL::add2Zahlen(QString zahl1, QString zahl2)
{
    int ziff1 = 0;
    int ziff2 = 0;
    int sum = 0;
    int merk = 0;
    QString erg, teilerg;
    bool ok;
    do{

        // Schön immer alles reseten für die Addition
        ziff1 = 0;
        ziff2 = 0;
        sum = 0;

        // Zahl1, Stellenweise zerlegen
        if(!zahl1.isEmpty()){
            ziff1 = zahl1.right(1).toInt(&ok, 10);
            zahl1.chop(1);
        }

        // Zahl2, Stellenweise zerlegen
        if(!zahl2.isEmpty()){
            ziff2 = zahl2.right(1).toInt(&ok, 10);
            zahl2.chop(1);
        }
        // Eigentliche Addition + Übertrag
        sum = ziff1 + ziff2 + merk;

        if(sum != 0){
            // Summe 1- oder 2- stellig ?
            teilerg = QString::number(sum);
            // Zehnerstelle merken
            if(sum > 9) merk = teilerg.left(1).toInt(&ok,10);
            else merk = 0;

            // Einer als Teilergebnis
            erg.prepend(teilerg.right(1));
        }
    }while(sum != 0);

    return erg;
}
8)

Verfasst: 26. Mai 2010 22:26
von upsala
Schön, nimm doch einfach mal meine Funktion und mess mal die Zeit dagegen.

Verfasst: 26. Mai 2010 23:02
von 24dan
Ups ....
da hab ich wohl was verblitzdings bekommen.

Genau ein ähnliches Problem hatten wir ja schon...

Also im Gegensatz zu meiner jetzigen Lösung bei der mir noch ein Fehler die Funktion unbrauchbar macht ist die von Dir
nutzbar und ich brauche hier auch keine Timing Probleme zu beachten da wo ich die einsetze ist die schnell genug.

Code: Alles auswählen


QString add(QString z1, QString z2) {
   QString result;
   const int l=qMax(z1.size(), z2.size());
   z1=z1.rightJustified(l, '0');
   z2=z2.rightJustified(l, '0');
   int wert=0;
   for (int pos=l-1; pos>=0; pos--) {
      wert+=z1.at(pos).digitValue()+z2.at(pos).digitValue();
      result=QString::number(wert%10)+result;
      wert/=10;
   }
   if (l==0 || wert>0) {
      result=QString::number(wert%10)+result;
   }
      
   return result;
} 
VIELEN DANK....

:wink:
  • zahl: "11" + "" = "11"
    zahl: "2" + "11" = "13"
    zahl: "3" + "13" = "16"
    zahl: "444444444444" + "16" = "444444444460"
    zahl: "55555555555555555555" + "444444444460" = "55555556000000000015"
    zahl: "66666666" + "55555556000000000015" = "55555556000066666681"
    zahl: "7777" + "55555556000066666681" = "55555556000066674458"
    zahl: "88888" + "55555556000066674458" = "55555556000066763346"
    zahl: "99999999999999" + "55555556000066763346" = "55555656000066763345"
    zahl: "33" + "55555656000066763345" = "55555656000066763378"
    zahl: "4" + "55555656000066763378" = "55555656000066763382"
    zahl: "5555555555555555" + "55555656000066763382" = "55561211555622318937"
    zahl: "6" + "55561211555622318937" = "55561211555622318943"
    zahl: "9999999999" + "55561211555622318943" = "55561211565622318942"
    zahl: "111111" + "55561211565622318942" = "55561211565622430053"
    zahl: "222222" + "55561211565622430053" = "55561211565622652275"
    zahl: "33333333333333" + "55561211565622652275" = "55561244898955985608"
    zahl: "4444" + "55561244898955985608" = "55561244898955990052"
    zahl: "5" + "55561244898955990052" = "55561244898955990057"
    zahl: "8888" + "55561244898955990057" = "55561244898955998945"