Seite 1 von 1

[gelöst] addition von Zahlenreihen (QString)

Verfasst: 14. März 2010 18:17
von 24dan
Hallo,
wollte gerne Zahlenkollonnen aufaddieren:
Z.B.
111111
222
555555555555555555555555555
6666
7
8888888888

Habe aber Probleme mit dem Datentypen: unsigned long ist zu klein
Brauche das Ergebnis nur als QString.

Erster Ansatz:
- Alle Häufigkeiten von 1-9 in einer QList<int> sammeln
- dann die List durchgehen
- Ist Häufigkeit an der Stelle i-k (k = Durchläufe) != 0
- DANN Stelle aufaddiern
Z.B: "1+2+5+6+7+8" + Rest (ist die 10er Stelle, am Anfang = 0)
- Ergebnis nach QString
- Letzte Stelle in ein QString werfen
- 10er Stelle = Rest

In meinem Beispiel würde zum Schluss nur ganz viel 5 an den Ergebnis String vorne eingefügt werden.

Verfasst: 14. März 2010 19:09
von upsala

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;
}

Verfasst: 14. März 2010 19:39
von 24dan
upsala :wink: ,
bin ich wohl doch zu langsam gewesen. Danke!

Hier meine Lösung

Code: Alles auswählen

// Wieviele Zahlen sind vorhanden
    QString test = "111 111 111 111 333 444 6666 77777 99 8";
    QList<int> l_anzahl;
// Häufigekeiten finden 
    for (int i = 1; i<=9; i++){
        int anzahl = test.count(QString::number(i,10));
        l_zwischen.insert(i, anzahl);
    }
// Häufigkeiten select 
    foreach(int value, l_zwischen)
         l_anzahl<<value;

// Teilungen rechnen und speichern
    QList<int> l_sort = l_anzahl;
    QString buffer, ergebnis;
    qSort(l_sort.begin(), l_sort.end(), qGreater<int>());
    int durchlauf=0;
    int rest = 0;
    bool ok;
    for(int i = 0;i<=l_sort.at(0); i++){
        // Teilergebnis der schriftlichen Addition
        int teil = 0;
        // Wieder bei 1 starten (... 9)
        int k = 1;
        foreach(int value, l_anzahl){
            // Prüfen ob Häufigkeit noch > Null
            if(value-durchlauf > 0){
                // Aufaddieren
                teil = teil + k;
            }
            // 1-9 hochzählen
            k++;
        }
        teil = teil + rest;
        // Nach jedem Durchlauf
        if(teil > 9){
            buffer = QString::number(teil,10);
            ergebnis.push_front(buffer.at(1));
            buffer.chop(1);
            rest = buffer.toInt(&ok,10);
        }
        else{
            ergebnis.push_front(QString::number(teil,10));
            rest = 0;
        }
        // Häufigkeiten runterzählen
        durchlauf++;
    }
    qDebug()<<"erg"<<ergebnis;

Werde mal die Zeit messen für diese und Deine Funktion...

see u end thx

Verfasst: 14. März 2010 20:21
von 24dan
Also time test ist wie folgt gelaufen:

Testzahl: ca. 4000 Stellen

Funktion1:

Code: Alles auswählen

 int g = 1;
    QStringList alles;
    foreach(int value, l_anzahl){
        if(value!=0)alles.append(QString::number(g,10).repeated(value));
        g++;
    }
    
// Start 1 

    QTime time1;
    time1.start();

    QString erg1 = "0";
    foreach(QString neueZahl, alles)
        erg1 = add(erg1, neueZahl);
    qDebug("Daten ZiffReihe1: %dms", time1.elapsed());

// Ende 1

    qDebug()<<"erg1"<<erg1;

Funktion2:

Code: Alles auswählen


    // Teilungen rechnen

// Start 2

    QTime time2;
    time2.start();
    QString erg2 = addZifferreihen(l_anzahl);
    qDebug("Daten ZiffReihe2: %dms", time2.elapsed());

// Ende 2

    qDebug()<<"erg2"<<erg2;

Ergebnisse:

Code: Alles auswählen

Daten ZiffReihe1: 15ms

Daten ZiffReihe2: 0ms