Cześć. Napisałem rozwiązanie zadania ze SPOJ'a: https://pl.spoj.com/problems/JLITOSL/ . Kod działa poprawnie dla liczb, które skladaja sie z trzycyfrowych segmentów cyfr od 1 do 9. W przypadku pojawienia się w rozpatrywanej liczbie zera lub gdy ilość cyfr w rozpatrywanej liczbie nie jest podzielna przez 3, pojawiają się dodatkowe spacje (liczba 013 jest przekształcana na "_trzynascie"). Byłbym wdzięczny za wskazówki, jak pozbyć się tych dodatkowych spacji z outputu mojego kodu...
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std;
string zamienNaSlowo (int liczba)
{
map <int, string> zapisSlowny;
zapisSlowny [1] = "jeden";
zapisSlowny [2] = "dwa";
zapisSlowny [3] = "trzy";
zapisSlowny [4] = "cztery";
zapisSlowny [5] = "piec";
zapisSlowny [6] = "szesc";
zapisSlowny [7] = "siedem";
zapisSlowny [8] = "osiem";
zapisSlowny [9] = "dziewiec";
zapisSlowny [10] = "dziesiec";
zapisSlowny [11] = "jedenascie";
zapisSlowny [12] = "dwanascie";
zapisSlowny [13] = "trzynascie";
zapisSlowny [14] = "czternascie";
zapisSlowny [15] = "pietnascie";
zapisSlowny [16] = "szesnascie";
zapisSlowny [17] = "siedemnascie";
zapisSlowny [18] = "osiemnascie";
zapisSlowny [19] = "dziewietnascie";
zapisSlowny [20] = "dwadziescia";
zapisSlowny [30] = "trzydziesci";
zapisSlowny [40] = "czterdziesci";
zapisSlowny [50] = "piecdziesiat";
zapisSlowny [60] = "szescdziesiat";
zapisSlowny [70] = "siedemdziesiat";
zapisSlowny [80] = "osiemdziesiat";
zapisSlowny [90] = "dziewiecdziesiat";
zapisSlowny [100] = "sto";
zapisSlowny [200] = "dwiescie";
zapisSlowny [300] = "trzysta";
zapisSlowny [400] = "czterysta";
zapisSlowny [500] = "piecset";
zapisSlowny [600] = "szescset";
zapisSlowny [700] = "siedemset";
zapisSlowny [800] = "osiemset";
zapisSlowny [900] = "dziewiecset";
string slowo;
map <int,string>::iterator it = zapisSlowny.find(liczba);
if (it != zapisSlowny.end())
{
slowo = it->second;
}
return slowo;
}
void zamienLiczbeTrzycyfrowaNaSlowo(int liczbaTrzycyfrowa)
{
int tymczasowa1, tymczasowa2 = 0;
tymczasowa1 = liczbaTrzycyfrowa % 100;
tymczasowa2 = liczbaTrzycyfrowa % 10;
liczbaTrzycyfrowa = liczbaTrzycyfrowa - tymczasowa1;
if (zamienNaSlowo(liczbaTrzycyfrowa) != " ")
cout << zamienNaSlowo(liczbaTrzycyfrowa) << " ";
if (tymczasowa1 < 20)
cout << zamienNaSlowo(tymczasowa1);
else
{
tymczasowa2 = tymczasowa1 % 10;
tymczasowa1 = tymczasowa1 - tymczasowa2;
if (zamienNaSlowo(tymczasowa1) != " ")
cout << zamienNaSlowo(tymczasowa1) << " ";
cout << zamienNaSlowo(tymczasowa2);
}
}
vector <string> podzielStringNaCiagiTrzycyfrowe (string &liczba)
{
const int dlugoscPodciagu = 3;
int dlugoscLiczby = liczba.length();
int liczbaPodciagow = dlugoscLiczby / dlugoscPodciagu;
vector <string> wektorCiagowTrzycyfrowych;
for (int i=liczbaPodciagow-1; i>=0; i--)
{
wektorCiagowTrzycyfrowych.push_back(liczba.substr(i*dlugoscPodciagu + dlugoscLiczby%dlugoscPodciagu, dlugoscPodciagu));
}
if (dlugoscLiczby % dlugoscPodciagu != 0)
wektorCiagowTrzycyfrowych.push_back(liczba.substr(0,dlugoscLiczby%dlugoscPodciagu));
return wektorCiagowTrzycyfrowych;
}
vector <int> zamienCiagiZnakowNaLiczby (vector<string> &wektorCiagowTrzycyfrowych)
{
vector <int> wektorLiczbTrzycyfrowych;
int dlugoscWektora = wektorCiagowTrzycyfrowych.size();
for (int i=0; i<dlugoscWektora; i++)
wektorLiczbTrzycyfrowych.push_back(stoi(wektorCiagowTrzycyfrowych [i]));
return wektorLiczbTrzycyfrowych;
}
void zamienWektorNaZapisSlowny (vector <int> &wektorLiczbTrzycyfrowych)
{
int dlugoscWektora = wektorLiczbTrzycyfrowych.size();
string rzadWielkosci [5] = {" ","tys. ","mln. ","mld. ","bln. "};
for (int i=dlugoscWektora-1; i>=0; i--)
{
zamienLiczbeTrzycyfrowaNaSlowo (wektorLiczbTrzycyfrowych[i]);
cout << " " << rzadWielkosci [i];
}
cout << endl;
}
int main()
{
int liczbaTestow;
string liczba;
cin >> liczbaTestow;
for (int i=0; i<liczbaTestow; i++)
{
cin >> liczba;
vector <string> wektorCiagowTrzycyfrowych = podzielStringNaCiagiTrzycyfrowe(liczba);
vector <int> wektorLiczbTrzycyfrowych = zamienCiagiZnakowNaLiczby(wektorCiagowTrzycyfrowych);
zamienWektorNaZapisSlowny (wektorLiczbTrzycyfrowych);
}
return 0;
}