C++ odczytywanie ilosci liter [spoj Flamaster]

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

#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;

}
0
#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;
}
2
#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;
}
0

co jest nie tak w tym algorytmie?

#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.

1
Janek_1998 napisał(a):

co jest nie tak w tym algorytmie?

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

a dokładniej:

(char)wyraz[i+1]

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

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