Wie kann ich ganz einfach die quersumme einer Zahl in C++ berechnen?

 - (Computer, Technik, programmieren)  - (Computer, Technik, programmieren)

4 Antworten

Mach einen Eingabedialog, in dem Du die ganze Zahl einliest, nicht nur ihre einzelnen Ziffern und rechne dann mithilfe %10 (gibt die letzte Ziffer) von hinten die verschiedenen Ziffern zusammen. Dann musst Du Dich auch was die Stellenanzahl angeht nicht festlegen.

Probier's jetzt erstmal selber und schau Dir dann meine Lösung an.

int main(){
   int zahl, quersumme = 0;
   cout<<"Gib eine Zahl ein.\n";
   cin>>zahl;
   while(zahl > 0){
      quersumme += zahl%10;
      zahl /= 10;
   }
   cout<<"Die Quersumme ist "<<quersumme<<endl;
   cin.sync();
   cin.get();

   return 0;
}

Es wird immer die letzte Ziffer der Zahl zur Quersumme hinzuaddiert und anschließend die Zahl ganzzahlig durch 10 geteilt (dadurch wird aus 568 beispielsweise 56.8, also ganzzahlig 56), bis die Zahl gleich 0 ist (5/10 ist dann 0.5 und ganzzahlig 0).

Also gar kein komplexer Algorithmus.

LG

Zuerst kannst du die Zahl in einen String konvertieren. Danach Länge des Strings messen. Nun Schleife laufen lassen, jede Ziffer einzeln aufrufen und in eine Zahl konvertieren. Nun Quersumme errechnen.

/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-  */
/*
 * main.cc
 * Copyright (C) 2017 Josef Wismeth <josef.wismeth@t-    online.de>
 *
 * quersumme is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * quersumme is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, sehttp://www.gnu.org/licenses/es/>.
 */

#include <iostream>
#include <sstream>   // wegen _itoa
#include <complex.h> // ebenfalls wegen _itoa


// Wandelt eine Dezimalzahl in einen String um
std::string _itoa(int number)
{
 std::ostringstream buff;
 buff << number;
 return buff.str();
}

//Errechnet die Quersumme einer als String gespeicherten Integer-Zahl
int iquersumme(std::string zwort)
{        
 int slei, sleib, lge, qsumme = 0;
 char zahlsymbole[10] = { '0','1','2','3','4','5','6','7','8','9'};

 lge = zwort.length();    
    
  for (slei = 0; slei < lge; slei++)
   for (sleib = 0; sleib < 10; sleib++)
    if (zwort[slei] == zahlsymbole[sleib])
     qsumme += sleib;

  return qsumme;
}

int main()
{
  int zahl = 1234, quersumme = 0;
  std::string zahlwort;    

  std::cout << "Bitte Zahl eingeben: ";
  std::cin >> zahl;

  zahlwort = _itoa(zahl);
  std::cout << "Zahl als String: " << zahlwort << std::endl;
 
  quersumme = iquersumme(zahlwort);     

  std::cout << "Quersumme: " << quersumme << std::endl;
 
  return EXIT_SUCCESS;
}



Das Problem ist, dass du nicht eine 4 stellige Zahl einliest, sondern 4 Zahlen, die je von -2147483648 bis 2147483647 gehen können... (ausser int hat auf deiner Plattform zufälligerweise !=32 Bit...)

P.S.: So gehts:

#include <iostream>
int quersumme(int zahl){
    int ergebnis = 0;
    while(zahl > 0){
        //Rest der Division durch 10 (also die letzte Ziffer) zum Ergebnis addieren
        ergebnis += zahl % 10;
        //"zahl" dezimieren (bei int u.ä. werdedn Nachkommastellen abgeschnitten)
        zahl /= 10;
    }
    return ergebnis;
}

int main(int argc, char *argv[]){
    std::cout << "zahl: ";
    int zahl;
    std::cin >> zahl;
    std::cout << "die quersumme von " << zahl << " ist " << quersumme(zahl) << "." << std::endl;
}

zahl macht keine Puffer für die Eingaben. Es ist einfach die letzte Zahl die eingegeben wird. gäbe man ein 1 2 3 100, wäre das Ergebnis 400.

Entweder nimmst du eine Methode die nur einzelne Zeichen einliest, oder du übernimmst die Zahl, konvertierst sie in einen String und arbeitest dann auf diesem weiter.