2017-06-29 3 views
0

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

Jede Ziffer hat zwei mögliche Zeichen. Wenn Sie einen schönen Binärbaum erhalten, können Sie rekursiv traversieren und zurückverfolgen. –

+2

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) –

+0

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. –

Antwort

2

Beiträge, die sicherlich Hausaufgaben sind mit einige Führungs Code profitieren, aber nicht zu viel - schwierig, dieses Gleichgewicht zu schlagen.


Für jede Ziffer gibt es zwei Möglichkeiten, die Ziffer zu addieren oder die Ziffer zu subtrahieren. @Eugene Sh.. Dies ist eine klassische Überlegung für eine rekursive Lösung. Für eine n-stellige Zahl erwarten Sie O (2 ** n) Iterationen.

Other approaches kann effizienter sein.

hart Vermeiden Codierung 42

#define HAPPY 42 

eine Hilfsfunktion Stellen, die in der Anzahl übergibt und die aktuelle Summe und gibt Erfolgsstatus.

Was sollte die Abbruchbedingung sein?
Wie zu tun einige der Arbeit?
Wie verschiedene Pfade für den Rest der Aufgabe versuchen?

int isHappy_helper(unsigned int aNum, int sum) { 
    if (aNum == TBD) { 
    return sum == HAPPY; 
    } 
    // Extract one digit from aNum (how about the least significant digit?) 
    int digit = TBD; 
    // What is left in aNum once the above digit is removed? 
    aNum = TBD; 
    // Try adding and subtracting the digit with the sum 
    return isHappy_helper(aNum, TBD) || isHappy_helper(aNum, TBD); 
} 

Rufen Sie die Hilfsfunktion mit einer Summe von TBD

int isHappy(unsigned int aNum) { 
    return isHappy_helper(aNum, TBD); 
} 

einige Testcode

void isHappy_test(unsigned int aNum) { 
    printf("%u %d\n", aNum, isHappy(aNum)); 
} 

int main() { 
    isHappy_test(0); 
    isHappy_test(1); 
    isHappy_test(9999993); 
    isHappy_test(999993); 
    isHappy_test(999399); 
    isHappy_test(399999); 
    isHappy_test(3783985861); 
    return 0; 
} 

Erwartete Ausgabe

0 0 
1 0 
9999993 0 
999993 1 
999399 1 
399999 1 
3783985861 1 
+0

Vielen Dank für Ihre Hilfe. Ich habe jetzt eine andere Idee für eine Lösung. Ich möchte die Zahl in ein Array von Ziffern aufteilen und einige Permutationen durchführen. – Apex

+0

Einfache, aber nette Idee, um einen Testcode in einer Hausaufgabenhilfe-Antwort zur Verfügung zu stellen. BTW, "O (2 ** n)": Überbleibsel einer verschollenen Jugend, die FORTRAN codiert? –

+2

@DavidBowling ... und ich vermisse die [3-way if] (https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn9p/index.html) auch. – chux

Verwandte Themen