Hej, mam pytanie z innej beczki....
Chodzi mi optymalizację kodu kalkulatora (piszę w C++). Rozwiązałam zadanie w ten sposób: http://wklej.to/JPnq129 , wyniki są poprawne ale niestety spoj nie chce uznać rozwiązania, bo przekracza limit czasu.
Czy ktoś ma pomysł/radę jak mądrze zoptymalizować mój kod?
Nie wiem czy to będzie wystarczająco mądrze? Ja w każdym razie [w tym przypadkowym razie] zoptymalizowałbym w ten sposób, że znacznie, ale to znacznie skróciłbym czas na oczekiwanie danych, których już więcej nie ma i już nie będzie - skończył się wraz z końcem plik z danymi [eof].
Jak?
Np tak:
while (cin >> wybor) { // jeżeli udało się jeszcze coś wczytać to idę do pętli, jeżeli już nic nie ma to nie [wchodzę]
zamiast:
for ( ; ; ) // czekanie w nieskończoność w pętli, aż do tle [przekroczenia limitu czasu]
Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych.
A więc nie sto.
W twoim programie zmienłbym:
1. nazwy x, y na a, b
2. wyrzucił drukowanie wyniku poza pętlę switch
3. w case ...: wynik = a + b; itd
4 lub nawet a += b; //a -= b itd. a jest zarówno daną do obliczeń jak i wynikiem
5 wczytywać [nieokreśloną liczbę danych] można też tak: while (cin >> wybor >> a >> b){
....
PS
6. gdy zrezygnujesz z getchar() blioteka stdio jest zbędna
Dzięki za 6 wskazówek, kod jest dużo prostszy
W zadaniu w specyfikacji wejścia jest jeszcze taka wypowiedź: "[...] Liczba testów nie przekracza 100, wynik zawiera się w typie int32". Z tego powodu zawęziłam for do 100 operacji. Nawet jeśli poprawnie zinterpretowałam to zdanie, no to wiem...kod nie jest uniwersalny, więc zmieniam na while(cin >> wybor >> a >> b)
Hej! Mam problem z zadaniem kalkulator...
Sędzia nie chce przyjąć mojego kodu, pomimo, że dane wyjściowe są
poprawne. Móglby ktoś powiedzieć mi co jest nie tak w tym kodzie?
Twój kod nie działa dla przykładowego wejścia: https://ideone.com/qO7M4s67. Zwróć uwagę, że w zadaniu nie jest podana liczba danych wejściowych - musisz wczytać ich nieznaną ilość. Odszukaj na tym albo starym (raczej starym) forum poradnik dotyczący wczytywania nieokreślonej liczby testów a po AC usuń kod.
Cześć. Mam problem z tym zadaniem. Jakich bym nie dał danych wejściowych wynik wychodzi mi dobry a Spoj nie zalicza.
Masz problem? - najpierw czytaj potem pytaj - tu już padała kilkakrotnie podpowiedź.
PS
A jednak. Takich nie dałeś:
https://ideone.com/D8ztq171
cześć wszystkim, próbowałem już zmienić wszystko, co było opisane w powyższych postach, ale wciąż wyskakuje mi błąd mimo, że przeprowadzam najróżniejsze testy i wszystko działa... Ktoś pomoże?
Trochę odkopuje ale nie działa mi kod: według mnie wszystko oki
include
using namespace std;
int main()
{
int32_t a,b;
char znak;
int ile;
int i=0;
cin>>ile;
while(i<ile)
{
cin>>znak>>a>>b;
i++;
switch (znak)
{
case '+':
cout<<a+b<<endl;
break;
case '-':
cout<<a-b<<endl;
break;
case '*':
cout<<a*b<<endl;
break;
case '/':
cout<<a/b<<endl;
break;
case '%':
cout<<a%b<<endl;
break;
}
}
}
Mój kod natomiast nie działa dobrze w samym zarodku - nie wykonuje poprawnie pętli, tj nie wraca z powrotem na podawanie zmiennej tylko od razu wyrzuca wynik i zakańcza jego pracę:
tekst programu należy przekazywać jako link do ideone.com6 - nie giną fragmenty kodu ani wcięcia, tam też warto przetestować program dla danych przykładowych w zadaniu i jeszcze kilku
a jeżeli pętla wykonuje się tylko raz a nie założoną liczbę razy to może wypada najpierw przyjrzeć się kodowi programu (w okolicach tej pętli) przed pisaniem na forum
warto też przeczytać wątek poświęcony zadaniu - można zaoszczędzić sporo czasu (twojego i odpowiadającego) nie zadając pytań które już były - ja zresztą nie mam zwyczaju odpowiadać na takie powtórzenia
program nie będzie działał poprawnie - w treści zadania nic nie ma o tym, że tych linii jest dokładnie 99 - w tym wątku już jest gdzieś tłumaczone, jak sobie radzić, gdy liczba danych jest nieokreślona
Porównaj, potestuj 2 poniższe wersje i zastanów się gdzie tkwi błąd. Kodowanie wymaga [niestety] dokładności i dbałości o szczegóły i szczególiki.:
// 1 - twoja wersja
for (int i = 1; i <= 99; i++);
{
cout << i << endl;
}
// 2 wersja
for (int i = 1; i <= 99; i++)
{
cout << i << endl;
}
PS
Ale to jest tylko taki zarodek bez znaczenia dla uzyskania AC - w twoim kodzie są inne, poważniejsze błędy.
cin >> a >> b nie może działać inaczej; temu nie mówiłem o zastosowaniu cin >> a >> b a cin >> wybor >> a >> b.
Więcej info http://213.192.104.217/phpBB3-spoj-pl-backup/viewtopic.php?f=10&t=120731