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

,
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: