• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SPOJ - nwd żenada

Aruba Cloud - Virtual Private Server VPS
–1 głos
573 wizyt
pytanie zadane 11 listopada 2018 w C i C++ przez program naczelny Gaduła (3,320 p.)
edycja 11 listopada 2018 przez program naczelny
#include <iostream>

using namespace std;
int w,r,t=1,g[30], h=0;
int nwd(int a, int b);

int main()
{
int a,b;
cin>>t;
for(int i=1; i<=t; i++)
{
a=0;
b=0;

cin>>a;
cin>>b;

nwd(a,b);

g[h]=r;
h++;
}
for(int i=0; i<t; i++)cout<<g[i]<<endl;
  return 0;
}

int nwd(int a, int b)
{
  if(a>=b)w=a;
  else w=b;

  for(int i=1; i<=w; i++)
  {
    if(a%i==0 && b%i==0)
    {
      r=i;
    }
  }
  return r;
}

ostrzegam że powyżej jest w sumie prawie spoiler. //edit: albo zupełnie nie

https://pl.spoj.com/problems/PP0501A/

Witam! Powyższa funkcja działa jak na leży, na bród kodu nie zwracajcie uwagi, jeszcze nie zdążyłem posprzątać, natomiast mam problem z inputem. W zadaniu pod powyższym linkiem należy całość wypisać w nast. spos:

Input:
5
1 4
4 1
12 48
48 100
123456 653421

Output:
1
1
12
4
3

natomiast w moi przypadku wszystko jest pod sobą, nie chce mi się pisać więc sprawdźcie w kodzie. W zadaniu jest napisane najpierw t (5) później w jednym wierszu pierwsze a i b, w drugim drugie itd. Na tym gównie się wyłożyłem bo jak ten kod wkleję to nie uzna. Wiecie jak użyć cin bez używania entera? albo raczej czy można użyć getch() które bez entera zadziała? bo zapewne robot sprawdzający jest tak ograniczony umysłowo że tylko zatwierdza tylko enterem mam rację? totalne dno. Nie wiem może pobrać to (liczba_spacja_liczba) jako ciąg char i potem podzielić ale czy to ma jakikolwiek sens?

//EDIT: już nieaktualne ale pytania jeszcze nie zamykam

 

komentarz 11 listopada 2018 przez Sheida Użytkownik (950 p.)
Jak zmienisz to

cin >> a;
cin >>b;

na

cin >> a, b;

To powinno działać
komentarz 11 listopada 2018 przez program naczelny Gaduła (3,320 p.)
niestety *nie* działa
komentarz 11 listopada 2018 przez Sheida Użytkownik (950 p.)
A klikasz po wpisaniu pierwszej liczby enter, czy po spacji wprowadzasz druga?
komentarz 11 listopada 2018 przez program naczelny Gaduła (3,320 p.)
w obydwa sposoby klikałem
komentarz 11 listopada 2018 przez adrian17 Mentor (352,580 p.)

cin >> a, b;

To powinno działać

(Um, nie, to nie ma prawa działać i ma dość mały sens; nawet kompilator to zauważa i krzyczy ostrzeżeniem)

komentarz 11 listopada 2018 przez Sheida Użytkownik (950 p.)
Musiało mi się coś pomylić, zdawało mi się, że widziałem taki zapis

2 odpowiedzi

+1 głos
odpowiedź 11 listopada 2018 przez adrian17 Mentor (352,580 p.)
wybrane 11 listopada 2018 przez program naczelny
 
Najlepsza

natomiast w moi przypadku wszystko jest pod sobą

 Na tym gównie się wyłożyłem bo jak ten kod wkleję to nie uzna

A próbowałeś w ogóle podać przykładowe wejście do programu? :)

Gdzie usłyszałeś, że `cin >> a`, wymaga, że po liczbie musi być nowa linia?

komentarz 11 listopada 2018 przez program naczelny Gaduła (3,320 p.)
1. jasne

2. Właśnie nic takiego nigdy nie słyszałem, ale przez enter jest to zatwierdzane i skacze. A jak spróbuję bez enter (np zamiast enter zatwierdzam spacją) to maszyna SPOJU tego nie przyjmie. absurd ale co poradze

3. Co zatem zrobić?
komentarz 11 listopada 2018 przez adrian17 Mentor (352,580 p.)

"zatwierdzenie" nic nie znaczy. Nie wiem co masz na myśli przez "zatwierdzenie spacją".

Jeśli piszesz

std::cin >> a;
std::cin >> b;
std::cin >> c;

Albo

std::cin >> a >> b >> c;

To nie ma znaczenia, czy na wejściu jest

1
2
3

czy

1 2 3

czy

1
2 3

3. Co zatem zrobić?

Powiem bardziej bezpośrednio: program w obecnej wersji działa poprawnie z wejściem SPOJa. Spróbuj użyć to przykładowe wejście i sam zobacz, zamiast gdybać.

komentarz 11 listopada 2018 przez program naczelny Gaduła (3,320 p.)
tak zrobiłem i nie przyjmuje teraz pisze że: Błąd wykonania SIGSEGV
komentarz 11 listopada 2018 przez adrian17 Mentor (352,580 p.)

Więc prawdopodobnie jest inny problem z programem.

Powtórzę: czy próbowałeś na własnym komputerze odpalić program z przykładowym wejściem?

Podpowiedź:

g[30]

Kto powiedział, że testów może być max 30?

(dodatkowy hint: kto powiedział, że w ogóle potrzebujesz tablicę?)

(hint życiowy: powtarzam prośbę o używanie zmiennych lokalnych o nazwach dłuższych niż jedna literka, bo tego się nie da czytać)

komentarz 11 listopada 2018 przez program naczelny Gaduła (3,320 p.)
właśnie myślałem że to wina tej pięknej tablicy ;) jednakże potrzebuje coś z tym zrobić aby pokazać wynik później, przenieść z r gdzie indziej, trochę głupia sytuacja.

3. postaram się przy następnym zadaniu.
komentarz 11 listopada 2018 przez program naczelny Gaduła (3,320 p.)

@adrian17, nowy problem to przekroczony limit czasu, wstawiam kod. Może być to nadal wina daklarowania zmiennych?

#include <iostream>

using namespace std;
int w,r,t=1,h=0;
int nwd(int a, int b);

int main()
{
cin>>t;
int a,b,g[t];
for(int i=1; i<=t; i++)
{
a=0;
b=0;

cin>>a>>b;

nwd(a,b);

g[h]=r;
h++;
}
for(int i=0; i<t; i++)cout<<g[i]<<endl;
  return 0;
}

int nwd(int a, int b)
{
  if(a>=b)w=a;
  else w=b;

  for(int i=1; i<=w; i++)
  {
    if(a%i==0 && b%i==0)
    {
      r=i;
    }
  }
  return r;
}

 

komentarz 11 listopada 2018 przez adrian17 Mentor (352,580 p.)

(powtarzam, że do niczego nie potrzebujesz tablicy :) )

nowy problem to przekroczony limit czasu

Może po prostu... algorytm jest wolny? Zastanów się nad tym, poczytaj etc.

komentarz 11 listopada 2018 przez program naczelny Gaduła (3,320 p.)
wiem że można zrobić to za pomocą rekurencji, więc tak spróbuję ;)

spale stary dom tylko fundamenty zostawię. albo z korzeniami.
komentarz 11 listopada 2018 przez adrian17 Mentor (352,580 p.)
(um, najbardziej znany sposób raczej nie jest rekurencyjny)
+1 głos
odpowiedź 11 listopada 2018 przez Potopiec Obywatel (1,550 p.)

std::cin>>a>>b;
możesz oddzielać spacją

Kiedyś bawiłem się trochę C++  i tutaj masz gotowca którego mi zaliczyło

#include <iostream>

int test,liczbaTestow;
int a,b;

int nwd(int a,int b){
  while(a!=b){
    if(a>b){
      a-=b;
    }else if(b>a){
      b-=a;

    };
  };
return a;
}


int main(int argc, char const *argv[]) {
  std::cin>>test;
  while(test>liczbaTestow){
  std::cin>>a>>b;

std::cout<<nwd(a,b)<<std::endl;

    liczbaTestow++;
  };

  return 0;
}

 

komentarz 11 listopada 2018 przez program naczelny Gaduła (3,320 p.)
dzięki, zrobię natomiast samowywołującą się funkcję =]

Podobne pytania

0 głosów
1 odpowiedź 432 wizyt
pytanie zadane 15 grudnia 2022 w SPOJ przez Pan_Blazej Nowicjusz (180 p.)
0 głosów
1 odpowiedź 295 wizyt
0 głosów
1 odpowiedź 159 wizyt
pytanie zadane 21 marca 2017 w SPOJ przez chucksqll Stary wyjadacz (12,930 p.)

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...