Nehmen wir an, eine Zahl heißt glücklich, wenn es eine Kombination von Addition und Subtraktion der Ziffern gibt, so dass das Ergebnis 42 ist.
Beispiel:
9999993, 999399 und 399999 ist glücklich, weil 9 + 9 + 9 + 9 + 9 - 3 = 42
3783985861 ist auch glücklich, weil: 3 + 7 + 8 - 3 + 9 + 8 - 5 + 8 + 6 + 1 = 42Kombination von Addieren und Subtrahieren von Ziffern für bestimmte Werte in C
Meine Idee:
- Zahl, wie lange die gegebene Zahl ist
- zählen Sie die Kombinationen: 2^n Kombinationen | n = Anzahl Länge
- für Schleife und überprüfen Sie alle Kombinationen, so dass das Ergebnis 42 aber wie ?????
- tun es rekursiv. Ich kann es tun, indem ich alle Ziffern addiere. Aber wie überprüft man alle Kombinationen?
int isHappy(unsigned int aNum){
int count = 0;
while(aNum != 0){
aNum /= 10;
count++;
}
int nTimes = 1;
for(int i=0;i<count;i++){
nTimes = nTimes * 2;
}
for(int i=0;i<nTimes;i++){
????
}
return nTimes;
}
int main(){
printf("%d", isHappy(999993));
return 0;
}
Jede Ziffer hat zwei mögliche Zeichen. Wenn Sie einen schönen Binärbaum erhalten, können Sie rekursiv traversieren und zurückverfolgen. –
Eine O (n^2) -Lösung ist mit dynamischer Programmierung möglich. Denken Sie darüber nach, ob es möglich ist, eine bestimmte Addition/Subtraktion der ersten paar Ziffern zu erhalten. Erstellen Sie ein 2D-Array, das nach der Anzahl der Ziffern und dem Ergebnis indiziert ist.(Edit: O (n^2) tatsächlich) –
Nur zum Spaß, beachten Sie, dass die Anzahl der Stellen in der Basis - * b * Darstellung einer Ganzzahl * x * ist O (log * x *), für jede * b * . Wie Sie die asymptotische Komplexität des Problems charakterisieren, hängt also stark davon ab, wie Sie die Größe des Problems definieren. –