Suma cyfr w liczbie zmiennoprzecinkowej

0

Witam.
Sume cyfr liczb całkowitych w c++ można przedstawić w ten sposób.

Jak przerobić ten kod by działał dla liczb zmiennoprzecinkowych podanych przez uzytkownika oraz ,aby to użytkownik kończył sumowanie cyfr kolejnych liczb po wpisaniu zera.
Dla liczb zmiennoprzecinkowych metoda % nie działa.Jaki sposob bedzie najlepszy do rozwiazania tego problemu?

Tutaj próbowałem zrobić też kończenie po wpisaniu zera,ale mi nie wyszło.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
	
	float liczba;
    float sumacyfr=0;;
	float a=0;
		
int n;	
cin>>n;
	
	for(int i=0;i<n;i++)
	{
	cin>>liczba;
	
 do {
   a=  liczba % 10;

   sumacyfr += a;
   liczba = (liczba -a) / 10;

  } while ( liczba != 0 );  
  
}		
	cout<<"suma cyfr :  "<<sumacyfr;

}
0

Wczytujesz liczby do stringa i sumujesz za pomocą atoi(), albo -'0'.
Suma cyfr, na pewno nie będzie zmienno przecinkowa, tylko całkowita. Czyli sumujesz to do inta, albo longa. Potrzebujesz Tylko jeszcze strnga dajmy na to n, do którego w peli do while, wczytujesz po kolei liczby i sumujesz cyferki dopóki n!='0'

0

To,że suma cyfr bedzie całkowita to ja wiem. Można to zrobić w inny sposob bez tego stringa i atoi?Nie wiele zrozumiałem z tego co mi podpowiedziałeś ;p

0

String to łańcuch znaków, jeśli przekształcisz na niego liczbę będziesz miał każdą cyfrę w czymś w rodzaju "tablicy na dopingu". Potem tylko brać kolejne znaki z stringa, jak znak okaże się cyfrą to przekształcić go z kodu ASCII na wartość liczbową i dodać do utworzonej w tym celu zmiennej (w twoim przypadku sumacyfr).

ps co do części po przecinku to można też mnożyć liczbę x10, aż float(liczba) będzie równy int(liczba) (czyli z ułamkowej zrobi się stała, rozumiem że akurat w tym przypadku to bez znaczenia, bo cyfry dokładnie te same).

0

string - przechowuje łańcuchy tekstowe. Wczytujesz do niego liczby.
do while - wiesz jak działa.
isdigit() - służy do sprawdzenia czy to co podałeś w parametrze jest cyferką. Jeżeli jest:
string[i]-'0' - tak zamienisz literkę na cyferkę, po czym dodajesz do sumy.

0

Dzieki wielkie,moze jakoś sobie poradze ;p

0

Na podstawie tego co już powiedziano można takie coś zrobić:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>
int main() {
    std::string num;
    std::cin >> num;
    std::vector<int> digits;
    std::for_each(num.begin(),num.end(), [&](char z) { if(isdigit(z)) digits.push_back((int) z - '0'); });
    std::cout << std::accumulate(digits.begin(), digits.end(),0);
}
0

Pomnóż razy 10^N, gdzie n jest ilością cyfr (dla float jest to 7-8, dla double 15-16).
Wtedy będziesz mógł podpiąć to do twojego algorytmu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1