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.
[gelöst] addition von Zahlenreihen (QString)
[gelöst] addition von Zahlenreihen (QString)
Zuletzt geändert von 24dan am 14. März 2010 19:43, insgesamt 1-mal geändert.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
(W. Heisenberg)
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;
}
upsala
,
bin ich wohl doch zu langsam gewesen. Danke!
Hier meine Lösung
Werde mal die Zeit messen für diese und Deine Funktion...
see u end thx
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
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
(W. Heisenberg)
Also time test ist wie folgt gelaufen:
Testzahl: ca. 4000 Stellen
Funktion1:
Funktion2:
Ergebnisse:
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;
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;
Code: Alles auswählen
Daten ZiffReihe1: 15ms
Daten ZiffReihe2: 0ms
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
(W. Heisenberg)