Zliczanie z ciągu bez tablic

0

Witam, dopiero zaczynam przygodę z c++ i trochę męczę się z tym zadaniem ponieważ nie umiem zrobić tego bez tablic. Ktoś ma jakieś pomysły?

Napisz program wczytuj¡cy liczby całkowite aż do pojawienia się zera i wypisujący długość najdłuższej sekwencji kolejnych liczb o takich samych warto±ciach (oraz tę wartość). Na przykład dla
23 22 23 22 23 3 3 23 2 -6 -6 -6 0
wynik powinien być
Longest sequence: 3 times -6

Nie używaj tablic, napisów ani żadnych innych kolekcji.

Z góry dzięki ;D

1

Nwm czy dobrze zrozumiałem treść zadania ale jeżeli chodzi o zliczanie kolejnych takich samych liczb to tak można to zrobić:

int main() {

  int previousSeqValue = 0, previousSeqNumber = 0;
  int currentSeqValue = 0, currentSeqNumber = 0;
  int value;
  do {
    std::cin >> value;
    if (value == currentSeqValue) ++currentSeqNumber;
    else {
      if (currentSeqNumber > previousSeqNumber) {
        previousSeqValue = currentSeqValue;
        previousSeqNumber = currentSeqNumber;
      }
      currentSeqValue = value;
      currentSeqNumber = 1;
    }

  } while (value != 0);

  if (currentSeqNumber > previousSeqNumber) {
    std::cout << currentSeqNumber << " times " << currentSeqValue << std::endl;
  } else {
    std::cout << previousSeqNumber << " times " << previousSeqValue << std::endl;
  }

  return 0;
}

dla 10 20 30 40 40 40 50 60 70 wynik bedzie: 3 times 40

1
Neron101 napisał(a):

23 22 23 22 23 3 3 23 2 -6 -6 -6 0
wynik powinien być
Longest sequence: 4 times 23

Wynik nic nie ma to wspólnego z sekwencją kolejnych liczb o tych samych wartościach.

Wynikiem raczej powinno być 3 times -6

1

@lookacode1: Dla 2, 3, 2, 2, 4, 5 ,0 daje 2 times 2, a powinno 3 times 2.

1

Zmienne:

  • last - ostatnia wczytana liczba
  • curr = 0 - obecna liczba
  • max_rep = 1 - najdłuższe powtórzenie
  • curr_rep = 1 - obecne powtórzenie
  • max_rep_num - liczba w najdłuższej sekwencji

Kroki:

  1. Wczytaj liczbę do last.
  2. Przypisz last do max_rep_num
  3. Jeśli last równe 0:
  4. Zakończ i wypisz "max_rep_num times max_rep_num"
  5. Wczytaj liczbę do curr.
  6. Jeśli curr równe 0:
  7. Zakończ i wypisz "max_rep_num times max_rep_num"
  8. Jeśli last jest równe curr:
  9. zwiększ curr_rep
  10. jeśli curr_rep większe od max_rep:
    1. Przypisz curr_rep do max_rep
    1. Przypisz curr do max_rep_num
  11. Jeśli last jest różne od curr:
  12. Przypisz curr do last
  13. Przypisz 1 do curr_rep
  14. Przejdź do kroku 4.
1

@hauleth: Sprawdź, poprawiłem to max_curr_rep i dodałem 1 w wydruku, bo nie zapamiętywał pierszej wczytanej liczby:

#include <iostream>
using namespace std;

void readNums() {
	int last;
	int curr = 0;
	int max_rep = 1;
	int curr_rep = 1;
	int max_rep_num;
	cout << "Enter the number: \n";
		cin >> last;
		cout << "\n";
		max_rep_num = last;
		if (last == 0) {
			cout << max_rep << " times " << max_rep_num << "\n";
			return;
		}
	while (1) {
		cin >> curr;
		cout << "\n";
		if (curr == 0) {
				cout << max_rep << " times " << max_rep_num << "\n";
				break;
				return;
		}
		if (last == curr) {
			curr_rep++;
			if (curr_rep > max_rep) {
				max_rep = curr_rep;
				max_rep_num = curr;
			}
		}
		if (last != curr) {
			last = curr;
			curr_rep = 1;
		}
	}
}

int main(int argc, char **argv){

  readNums();
	return 0;
}

0
lion137 napisał(a):
				break;
				return;

Może zaczniesz czytać komunikaty kompilatora?

lion137 napisał(a):
			curr_rep++;

http://forum.4programmers.net/1101404

lion137 napisał(a):
		cin >> last;
		cout << "\n";
		if (last == 0) {
			cout << max_rep << " times " << max_rep_num << "\n";
			return;
		}
		cin >> curr;
		cout << "\n";
		if (curr == 0) {
				cout << max_rep + 1 << " times " << max_rep_num << "\n";
				break;
				return;
		}

Słyszałeś o podstawowych zasadach jak np DRY?

0

Mój kompilator g++-8 milczy jak zaklęty, a w ogóle to nie mój kod, przepisałem tylko pseudokod @hauleth.

1

Generalnie nie da się rozwiązać tego bez tablicy, dowód w postaci przykładu:
1
2
3
1
2
3
1
2
3
...
1
2
3
tu dowolna cyfra z przedziału 1..3 <= czyli w tym miejscu trzeba znać ilości każdej z 3-ch liczb
0

Po zmianie zadania przez moderatora:
Wczoraj nie tylko @serek snu potrzebował :D

#include <iostream>
using namespace std;
 
int main()
{
    size_t bestcount=0,count=0;
    int bestvalue=0;
    for(int value=0,curr=0;(cin>>curr)&&(curr);)
    {
        if(value!=curr)
        {
            value=curr;
            count=0;
        }
        if(bestcount<++count)
        {
        	bestcount=count;
        	bestvalue=value;
        }
    }
    if(count) cout<<bestcount<<" times "<<bestvalue<<endl;
    else cout<<"0 times nothing";
    return 0;
}

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