Prime Generator SPOJ POMOCY

0

Siema, mam problem z zadaniem ze SPOJ'a. http://www.spoj.pl/problems/PRIME1/
Nie wiem jak napisać program tak, aby po podaniu t,n i m zamiast wypisywania wyników od razu na bieżąco, zapamiętywał je i wykonywał te same obliczenia z innymi liczbami tyle razy ile będzie wynosiło t i na koniec podawał całość, wszystkie wyniki oddzielone pustą linią. Myslałem nad wstawieniem tam funkcji i zapisywaniem wyników do tablic ale sam nie wiem.
Tutaj coś naskrobałem. Proszę o pomoc i pozdrawiam.

program petlawpetli;
var
a,b,c,d,m,n,t:integer;
begin
readln(t);
for c:=1 to t do
BEGIN
readln(m);
readln(n);
END;
for m:=m to n do
begin
for a:=1 to m do
begin
if m mod a=0 then b:=b+1;
if a=m then
begin
if b=2 then writeln(m);
b:=0;
end;
end;
end;
readln;
end.

0

Po 1 człowieku formatuj kod, bo kiedyś spojrzysz na kod programu i gó.fno będziesz wiedział

po 2. Schemat:

  1. Podajesz liczbe testów
  2. Podajesz przedział odkąd - dokąd ma sprawdzać czy liczba jest pierwsza.
  3. robisz pętle for zmienna:= odkąd to dokąd do
    a) robisz pętle w pętli powyżej: for zmienna1:= 2 to zmienna-1 do
    b) sprawdzasz warunek czy zmienna mod zmienna1 = 0, jeśli prawda to liczba NIE jest 'prime', jeśli fałsz to liczba JEST prime.
0

dzięki za szybką odpowiedź ;) to co napisałeś, mam w kodzie powyżej albo prawie to samo i już wcześniej to wymyśliłem. Bardziej chodziło mi o tą liczbę testów. Z t=1 jest łatwo, ale przy większej ilości testów nie wiem jak to zrobić tak aby działało to jak tutaj wypisze:

1.ktoś podaje liczbe testów np.2
2.pierwszy przedział od np.1 do 10
3.drugi przedział od np.3 do 5
4.program wylicza dla przedziału 1-10 liczby: 2,3,5,7 i je sobie gdzieś tam zapisuje(nie wypisuje ich)
5.program przechodzi do następnego przedziału 3-5 i wylicza dla niego 3,5
6.tutaj następuje wypisanie wszystkich wyników i dla każdego kolejnego przedziału jest jedna linia odstępu.

wynik wygląda tak:
2
3
5
7

3
5
pozdrawiam

0

1.ktoś podaje liczbe testów np.2
2.pierwszy przedział od np.1 do 10
3.drugi przedział od np.3 do 5
4.program wylicza dla przedziału 1-10 liczby: 2,3,5,7 i je sobie gdzieś tam zapisuje(nie wypisuje ich)
5.program przechodzi do następnego przedziału 3-5 i wylicza dla niego 3,5
6.tutaj następuje wypisanie wszystkich wyników i dla każdego kolejnego przedziału jest jedna linia odstępu.

A czemu nie tak:

1.Wczytanie liczby testów, np.2.
2.test = 1
3.Wczytanie dwóch liczb oddzielonych spacją.
4.Obliczenie liczb pierwszych i ich wypisanie.
5.test := test + 1
6.Jeżeli test < liczba testów, idź do punktu trzeciego.

Przecież można wypisywać wyniki na żywo...

0

@up

Ale zdajesz sobie sprawe ze takie "liczenie na zywo" jest bardziej czasochlonne. Lepiej zebrac granice. Potem dla granic polozonych "blisko siebie" znalezc rozpietosc i wyliczyc dla niej liczby. Wtedy dla 100 testow mozemy miec przykladowo 10 wyliczen zamiast 100, a jak wiadomo najbardziej czasochlonne jest tutaj wlasnie wyliczanie liczb pierwszych.

0

tylko, że ja mam najpierw podać Wszystkie dane do programu
2
1 10
3 5

a następnie mają mi sie wyświetlić wyniki:
2
3
5
7

3
5
bo SPOJ nie uznaje inaczej poprawności programu. Nie wiem jak zrobić, żeby program zapamiętywał te wyniki i na koniec wyświetlał całość.
na razie mam coś takiego

program PRIME;
var
a,b,c,d,m,n,t:integer;
begin
readln(t);
c:=c+1;
while c<t do
BEGIN
read(m,n);
for m:=m to n do
begin
for a:=1 to m do
begin
if m mod a=0 then b:=b+1;
if a=m then
begin
if b=2 then writeln(m);
b:=0;
end;
end;
end;
END;
readln;
end.

0

@sajgon9 guzik prawda. Wejście dla programu to co innego niż wyjście. Dla ciebie w konsoli wygląda że się "mieszają" ale w rzeczywistości tak nie jest.

1

zaciekawiony tym wątkiem popełniłem takiego gotowca w C# - odrzutowo szybka metoda do sprawdzania pierwszości dużych liczb: Test pierwszości liczby metodą probabilistyczną. na pewno pozwoli rozwiązać zadanie w dość przekorny sposób.
być może dla autora wątku będzie to ciut zbyt trudne, ale cóż, trzeba się rozwijać.

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