2015-10-13 7 views
6

Sto iniziando a imparare C++ da solo e sono confuso con un compito che sto cercando di completare. L'utente digita i numeri naturali finché vuole finché non digita 0. Dopo di che il mio programma dovrebbe trovare la più grande somma di cifre che sono state digitate e stamparle. Stampa anche un numero da cui ha preso la somma. Ecco quello che ho cercato di fare:Dividere un numero intero e trovare la somma più grande C++

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    int input = 0; 
    int digit; 
    int sum = 0; 
    int largest = 0; 

    do 
    { 
     cout << "enter a natural number (0 if done): " << flush; 
     cin >> input; 

     while (input > 0) 
     { 
      digit = input % 10; 
      sum = sum + digit; 
      input = input/10; 
     } 
     if (sum > largest) 
      largest = sum; 

    } while (input); 

    cout << "Max sum of digits was " << largest << "for" << endl; 
} 

quando sono in esecuzione il programma conta somma delle cifre da solo prima digitato in numero e smettere di lavorare. Quando prendo lo while (input > 0), fa un ciclo, ma non conta cifre. Sarò molto grato per l'aiuto e la spiegazione. P.S. Scusa per il mio inglese, non sono madrelingua.

+0

Che cos'è un "digest sum"? – deviantfan

+0

mi spiace, somma cifre –

+0

Quando esci dal ciclo 'while (input> 0)', input == 0' (perché l'input = input/10; 'dell'ultima iterazione restituirà 0). Quindi, quando premi '} while (input);' la condizione è 'false' e ​​ti interrompi dal ciclo esterno' do {..} while' dalla sua prima iterazione. Ecco perché ottieni solo l'iterazione '1'. – 865719

risposta

2

Lei sembra avere tre problemi qui:

1 - Si sta tentando di utilizzare una variabile che y ou essenzialmente impostato a zero nel ciclo while

2 - Lei sembra essere alla ricerca per l'ingresso che è per la più grande somma

3 - non si stanno ripristinando la variabile somma per ogni ingresso

Il la soluzione per il primo problema è "eseguire il backup" dell'input in un'altra variabile prima di modificarla e utilizzare quella variabile per il ciclo while.

Ciò consente anche di ottenere quello che è il numero più grande immesso e memorizzarlo.

int input = 0; 
int inputBackup = 0; 
int digit; 
int sum = 0; 
int largest = 0; 
int largestInput = 0; 

Per aggiungere nella variabile inputBackup, metterlo dopo il cin.

Quindi impostare largestInput nella propria sum > largest istruzione if per impostare largestInput se è il più grande.

cout << "enter a natural number (0 if done): " << flush; 
cin >> input; 

inputBackup = input;// This line 
sum = 0;   // and this line 

while (input > 0) 
{ 
    digit = input % 10; 
    sum = sum + digit; 
    input = input/10; 
} 
if (sum > largest) 
{ 
    largest = sum; 
    largestInput = inputBackup;// Store largest input 
} 

Poi cambiare while(input) a while(inputBackup) controlla la variabile inputBackup invece del input uno.

Cambia la tua cout essere così per aggiungere la variabile largestInput in esso

cout << "Max sum of digits was " << largest << " for " << largestInput << endl; 

e il codice dovrebbe essere risolto!

Happy Coding!

+0

Questo è fantastico! Grazie mille)) –

+0

Nessun problema! Ho appena visto che sembravi avere più domande nella domanda rispetto a quella iniziale che avevi detto – Elipzer

2
do 
{ 
    cout << "enter a natural number (0 if done): " << flush; 
    cin >> input; 
    //more code 
} while (input); 

per fare questo lavoro in modo corretto, input non può cambiare tra il cin e la condizione del ciclo.

Ma

while (input > 0) { 
    digit = input % 10; 
    sum = sum + digit; 
    input = input/10; 
} 

non cambia input.

sostituirlo con qualcosa di simile a

int input2 = input; 
while (input2 > 0) { 
    digit = input2 % 10; 
    sum = sum + digit; 
    input2 = input2/10; 
} 
+0

Conta la somma di tutte le cifre, ma ho ancora bisogno della somma di ogni numero che ho digitato :( –

1

Try che invece

Se non pari a zero sum valore, accumuliamo somma di tutte le cifre di ingresso e la somma sarà sempre più grande di quello largest valore, perché memorizza largest + sum delle cifre dei valori correnti. Quindi, se azzeriamo il valore sum, esso contiene solo la somma di cifre dell'input corrente e può essere semplice rispetto a quello precedente che era largest.

#include <iostream> 
#include <conio.h> 

using namespace std; 



int main() { 

    int input = 0; 
    int digit; 
    int sum = 0; 
    int largest = 0; 

    do 
    { 
     while (input > 0) { 
      digit = input % 10; 
      sum = sum + digit; 
      input = input/10; 
      } 
       if (sum > largest) 
        largest = sum; 

     sum = 0; // set to 0 current sum 

     cout << "enter a natural number (0 if done): " << flush; 
     cin >> input; 

    } while (input); 

    cout << "Max sum of digits was " << largest << " for" << endl; 

    _getch(); 

    return 0; 
} 
+0

Puoi semplicemente sostituire il codice di input alla fine del ciclo, funzionerà correttamente perché inizializzi la variabile di input con 0 e per questo motivo il tuo ciclo interno verrà ignorato – Mykola

+1

Funziona meglio, ma non nel modo in cui mi serviva Ora conta la somma di tutte le cifre digitate, ma ho bisogno della somma di cifre di ogni numero. dovresti scegliere la somma più grande Forse puoi consigliare come fare? –

+0

ora deve funzionare correttamente – Mykola

1

In questa parte:

while (input > 0) { 
    digit = input % 10; 
    sum = sum + digit; 
    input = input/10; 
} 

mentre l'ingresso non è zero che sarà ripetere, così quando uscire loop il valore di ingresso è 0. Utilizzare una variabile ausiliaria o racchiudere questo codice una funzione:

int getDigitsSum(int input) { 
     while (input > 0) { 
     digit = input % 10; 
     sum = sum + digit; 
     input = input/10; 
     } 
     return sum; 
} 
+0

si dimentica la somma di ritorno – Mykola

+0

è davvero, grazie Mykola! –

Problemi correlati