2015-10-13 11 views
6

Zaczynam samodzielnie uczyć się C++ i jestem zdezorientowany jednym zadaniem, które próbuję ukończyć. Użytkownik shoud wpisuje liczby naturalne tak długo, jak chce, dopóki nie wpisze 0. Następnie mój program powinien znaleźć największą sumę cyfr, które zostały wpisane i wydrukować. Powinien również wydrukować numer, z którego pochodziła suma. Oto co próbowałem zrobić:Dzielenie liczby całkowitej i znajdowanie największej sumy 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; 
} 

Kiedy biegnę programm liczy sumę cyfr z tylko pierwszy wpisany numer i przestać działać. Oddalając while (input > 0) tworzy pętlę, ale nie liczy cyfr. Będę bardzo wdzięczny za pomoc i wyjaśnienia. P.S. Przepraszam za mój angielski, nie jestem native speakerem.

+0

Co to jest "podsumowana suma"? – deviantfan

+0

Przepraszam, cyfry sum –

+0

Po wyjściu z pętli 'while (input> 0)' 'input == 0' (ponieważ' input = input/10; 'z ostatniej iteracji zwróci 0). Dlatego, gdy naciśniesz '} while (input);" warunek to "false", a ty przerwiesz od zewnętrznej pętli 'do {..} while' z pierwszej iteracji. Dlatego dostajesz tylko iterację '1'. – 865719

Odpowiedz

2

wydaje się mieć trzy problemy tutaj:

1 - próbujesz użyć zmiennej że Y ou zasadniczo ustawiony na zero w pętli while

2 - Wydaje się, że patrząc na wejście, które jest za największą sumę

3 - Nie jesteś zresetować zmienną sumy dla każdego wejścia

Rozwiązaniem pierwszego problemu jest "wykonanie kopii zapasowej" danych wejściowych na inną zmienną przed jej zmodyfikowaniem i użyciem tej zmiennej dla pętli while.

Umożliwia to również uzyskanie największej wprowadzonej liczby i zapisanie jej.

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

Aby dodać do zmiennej inputBackup, umieścić go po cin.

Następnie ustaw largestInput w swojej instrukcji sum > largest, aby ustawić largestInput, jeśli jest największa.

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 
} 

Następnie zmień while(input) do while(inputBackup) aby sprawdzić zmienną inputBackup zamiast jednego input.

Zmień cout tak być, aby dodać do zmiennej largestInput powinno

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

a kod można naprawić!

Happy Coding!

+0

To jest świetne! Dziękuję bardzo)) –

+0

Nie ma problemu! Właśnie zobaczyłem, że ty miałeś więcej pytań w tym pytaniu niż pierwsze, które powiedziałeś – Elipzer

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

aby to działało poprawnie, input nie mogą ulec zmianie między cin i stanu pętli.

Ale

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

ulega zmianie input.

zastąpić czymś jak

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

Zlicza sumę wszystkich cyfr, ale wciąż potrzebuję sumy wszystkich wprowadzonych cyfr :( –

1

spróbować zamiast

Jeśli nie zerowy sum wartość, to gromadzą się sumę wszystkich cyfr wejściowych i suma będzie zawsze większa niż niż largest wartości, ponieważ przechowuje largest + sum aktualnych cyfr wartości. Tak więc, jeśli zerujemy wartość sum, zawiera ona tylko sumę cyfr aktualnego wejścia i może być prosta w porównaniu z poprzednim, który był 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

Możesz po prostu zamienić swój kod wejściowy na koniec pętli, będzie on działał poprawnie, ponieważ zainicjalizujesz zmienną wejściową za pomocą 0 i z tego powodu twoja wewnętrzna pętla zostanie zignorowana – Mykola

+1

Działa lepiej, ale nie w taki sposób, w jaki potrzebowałem, teraz zlicza wszystkie wpisane cyfry, ale potrzebuję sumy cyfr każdej liczby, a potem program powinien wybrać największą kwotę.Może możesz polecić, jak to zrobić? –

+0

teraz to musi działać poprawnie – Mykola

1

W tej części:

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

podczas gdy wejście nie jest zero, będzie to powtórzyć, więc kiedy wyjść z pętli wartość wejścia wynosi 0. użyć zmiennej pomocniczej lub ująć ten kod na funkcja:

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

zapomniałeś zwrotu sumy – Mykola

+0

to naprawdę, dzięki Mykola! –

Powiązane problemy