C++ odczytywanie ilosci liter [spoj Flamaster]

C++ odczytywanie ilosci liter [spoj Flamaster]
J1
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:10
0

Witam,
mam program jak ponizej, obecnie dziala tak, ze wpisuje litery, i wtedy program wypisuje mi ile bylo nastepujacych liter, np. AAAABBBBB - > A4B5
https://pl.spoj.com/problems/FLAMASTE/

natomiast teraz mam zrobic na odwrot, wpiszę A4B5 i program wyswietli mi AAAABBBBB - prosba o podpowiedz

Kopiuj
#include <iostream>
#include <sstream>

using namespace std;



string konwersjaIntNaString (int liczba)
{
    ostringstream ss;
    ss << liczba;
    string str = ss.str();
    return str;
}

int obliczWystapieniaWybranegoZnaku ( string wyraz, int pozycjaZnaku)
{
    int iloscWystapien = 1;
    if (wyraz.length() > pozycjaZnaku)
    {
        while (wyraz[pozycjaZnaku] == wyraz[pozycjaZnaku+1])
        {
            iloscWystapien++;
            pozycjaZnaku++;
        }
    }
    else
        iloscWystapien = 0;
    return iloscWystapien;
}


string skracanieWyrazow (string wyrazDoSkrocenia)
{


    int dlugosc = wyrazDoSkrocenia.length();
    int iloscWystapien;
    char powtarzajacySieZnak;

    for (int i = 0; i < dlugosc-2; i ++)

    {
        // sprawdzamy czy wystepuja 3 takie samie znaki obok siebie
        if ((wyrazDoSkrocenia [i] == wyrazDoSkrocenia [i+1]) && (wyrazDoSkrocenia [i+1] == wyrazDoSkrocenia [i+2]))

        {
            iloscWystapien = obliczWystapieniaWybranegoZnaku (wyrazDoSkrocenia, i);
            powtarzajacySieZnak = wyrazDoSkrocenia[i];

            wyrazDoSkrocenia.replace(i, iloscWystapien, powtarzajacySieZnak + konwersjaIntNaString(iloscWystapien));

            dlugosc = wyrazDoSkrocenia.length();
        }

    }
    return wyrazDoSkrocenia;

}
int main()
{

    int iloscTestow;
    string wyraz;

    cin >> iloscTestow;

    for (int i=0; i<iloscTestow; i++)
    {
        cin >> wyraz;
        cout << skracanieWyrazow(wyraz) << endl;
    }

    return 0;

}
edytowany 4x, ostatnio: cerrato
gk1982
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Łódź
  • Postów:541
0
Kopiuj
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>

using namespace std;

int
main ()
{
  string str = "aaH13e12o2a";
  string tmp;
  int num = 0;
  /*for(int i=0;i<str.size();i++)
     {
     if(isdigit(str[i+1]))
     {
     cout<<std::string((int)str[i+1]-'0', str[i]);
     i=i+1;
     }
     else
     cout<<str[i];
     } */
  for (int i = 0; i <= str.size (); i++)
    {

      if (isdigit (str[i]))
	{
	  tmp = tmp + str[i];
	  if (!isdigit (str[i + 1]))
	    {
	      stringstream ss;
	      ss << tmp;
	      ss >> num;
	      cout << std::string (num - 1, str[i - int (log10 (num) + 1)]);
	      tmp = "";
	      num = 0;
	    }
	}
      else
	cout << str[i];
    }
  return 0;
}

Don't give up learning JavaScript!
It is enjoyable to make things visible which are invisible.
Każdy programista przybywający z innego miasta jest fachowcem.
Anyone who stops learning is old, whether at twenty or eighty.
Anyone who keeps learning stays young.
The greatest thing in life is to keep your mind young.
_13th_Dragon
Złożoność jest okropna!
gk1982
Niestety tylko dorywczo coś zaprogramuje w wolnej chwili, można nie patrzeć na moje wypociny :D
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
2
Kopiuj
#include <iostream>
#include <sstream>
using namespace std;

int main()
{
	istringstream is("aaH13e12o2a");
	for(char ch;is>>ch;is.clear())
	{
		int count;
		if(!(is>>count)) count=1;
		while(count--) cout<<ch;
	}
	return 0;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:9 minut
2

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
J1
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:10
0

co jest nie tak w tym algorytmie?

Kopiuj
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>

using namespace std;

int main ()
{
string wyraz;
string tmp;
int num =0;

cin >> wyraz;
for(char i=0; i<wyraz.size(); i++)
{
if(isdigit(wyraz[i+1]))
{
cout<<string((char)wyraz[i+1], wyraz[i]);
i=i+1;
}
else
cout<<wyraz[i];
}
return 0;
}

z gory dzieki.

edytowany 1x, ostatnio: cerrato
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
1
Janek_1998 napisał(a):

co jest nie tak w tym algorytmie?

Kopiuj
cout<<string((char)wyraz[i+1], wyraz[i]);

a dokładniej:

Kopiuj
(char)wyraz[i+1]

Generalnie to jest totalne badziewie nawet po naprawieniu nie będzie interpretować poprawnie ilość powtórzeń większą niż 9


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.