Liczby super pierwsze (zakres)

Liczby super pierwsze (zakres)
AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Witam, mam do napisania program, który będzie sprawdzał czy dana liczba jest liczbą super pierwszą i będzie wypisywał liczby pierwsze z wyznaczonego zakresu.

Liczba super pierwsza to liczba pierwsza, której suma cyfr daje liczbę pierwszą. np. 11, 17, 23

Napisałem więc program, który sprawdza czy dana liczba jest liczbą super pierwszą:

Kopiuj
var
a, l1, p1, wynik:integer;

begin

a:=StrToInt(Edit1.Text);
l1 := 0;
p1 := 1;
wynik := 0;

for p1 := 1 to a do
  if a mod p1 = 0 then
    begin
    l1 := l1 + 1;
    end;
  begin
  if l1 = 2 then
    begin
    while a <> 0 do
      begin
      wynik := wynik + (a mod 10);
      a := a div 10;
      end;
    for p1 := 1 to wynik do
      if wynik mod p1 = 0 then
        begin
        l1 := l1 + 1;
        end;
      begin
      if l1 = 2 then
        Edit2.Text:='NIE'
      else
        Edit2.Text:='TAK';
      end;
    end
  else
  Edit2.Text:='NIE';

end;
end;

Wszystko działa tak jak chce, tylko teraz mam problem z drugą częścią, kiedy próbuje zrobić pętle tak żeby wartość była podnoszona co pętle o 1 i sprawdzana czy jest liczbą super pierwszą to program mi się zapętla.

Chodzi mi oto, że w Edit1 użytkownik wprowadza wartość do której będzie się kończył zakres, a w Memo1. Lines będą wypisywane kolejne liczby super pierwsze:

Kopiuj
var
a, b, l1, p1, wynik:integer;

begin

b:=StrToInt(Edit1.Text);
l1 := 0;
p1 := 1;
wynik := 0;

repeat
a:=a+1;
for p1 := 1 to a do
  if a mod p1 = 0 then
    begin
    l1 := l1 + 1;
    end;
  begin
  if l1 = 2 then
    begin
    while a <> 0 do
      begin
      wynik := wynik + (a mod 10);
      a := a div 10;
      end;
    for p1 := 1 to wynik do
      if wynik mod p1 = 0 then
        begin
        l1 := l1 + 1;
        end;
      begin
      if l1 = 2 then
        
      else
        Memo1.Lines.Add(IntToStr(a));
      end;
    end
  else
 

end;
until a = l;
end;

Z góry dziękuje za pomoc w rozwiązaniu problemu.

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

zacznij od napisania funkcji:
function czypierwsza(n:integer):boolean;
function sumacyfr(n:integer):integer;
to później przyśpieszymy działanie o jakieś kilkanaście tysięcy razy

AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Rozumiem, że program jest napisany w mało optymalny sposób ale to akurat w tej chwili jest mało ważne, zależy mi na zrobieniu tego zakresu i byłbym wdzięczny jeżeli byś w tym kierunku mi pomógł.

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

napisz te funkcje! będzie znacznie łatwiej ogarnąć

AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Nie potrafie

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
1

+demo programik, takie trudne? :-) toć przecie kawałek twojego programu

Kopiuj
function czypierwsza(a:integer): boolean;
var l1, p1:integer;
begin
  l1 := 0;
  for p1 := 1 to a do
    if a mod p1 = 0 then
      l1 := l1 + 1;
  czypierwsza:= l1 = 2
end;
 
var i:integer;
begin
  for i:=1 to 100 do 
    if czypierwsza(i) then write( i, #32);
end. 
AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

No niby nie trudne, ale nigdy tego nie robiłem, to widze wypisuje mi pierwsze, czyli dodać tylko sumowanie do funkcji tak? a bez funkcji nie da się tego zrobić?

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

wtedy nie pogubisz się ze zmiennymi bo program będzie miał 5 linijek

AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

czyli tak wyglądałaby funkcja dla sumy cyfr tak?

Kopiuj
function sumacyfr(n:integer):integer;
var a, wynik:integer;
begin
    while a <> 0 do
      begin
      wynik := wynik + (a mod 10);
      a := a div 10;
      end;
sumacyfr:=wynik;
end;

a później coś takiego?:

Kopiuj
var i:integer;
begin
  for i:=1 to 100 do 
    if czypierwsza(i) and czypierwsza(sumacyfr(i))
then write( i, #32);
end. 
Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

raczej tak:

Kopiuj
function sumacyfr(a:integer):integer;
var wynik:integer;
begin
    wynik := 0;
    while a <> 0 do
    begin
        wynik := wynik + (a mod 10);
        a := a div 10;
    end;
    sumacyfr:=wynik;
end; 

widzisz o ile łatwiej?

AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

No nareszcie działa, dzięki wielkie Xitami miałeś racje sposób znacznie łatwiejszy, wszystkiego dobrego.
Temat można zamknąć.

AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Jeden problem się rozwiązał to pojawia się kolejny, okazuje się, że algorytm zle działa, wypisuje mi liczby pierwsze a nie super pierwsze w pierwszym poście jest pomyłka liczba 17 nie jest liczba super pierwsza, 1+7=8 a 8 nie daje pierwszej... W czym problem? warunki sa raczej dobrze.

olesio
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
  • Postów: 4191
0

Ten kod który podał poprzednik jest ok, nie wiem jakim cudem u Ciebie zwraca 17, ja skompilowałem ten kod pod Delphi 7 poprawiając czytelność czyli dając zmienne z wielkich liter i nazwy funkkjci również, a także zmieniając a, na X, bo nie lubię jak zmienna się nazywa a, kiedy nie jest tablicą. Także taki kod nie ma prawa zwrócić Tobie 17. Gdybyś sprawdzał czy tylko jest liczbą pierwszą to tak, ale sprawdzasz przecież jeszcze czy suma cyfr jest liczbą pierwszą, a w takim wypadku nie ma prawa zwrócić 17 i nie zwraca.

Kopiuj
program Project2;

{$APPTYPE CONSOLE}

function CzyPierwsza(X : integer) : boolean;
var
  L1, P1 : integer;
begin
  L1 := 0;
  for P1 := 1 to X do
    if X mod P1 = 0 then
      L1 := L1 + 1;
  CzyPierwsza := L1 = 2;
end;

function SumaCyfr(X : integer) : integer;
var
  Res : integer;
begin
  Res := 0;
  while X <> 0 do
  begin
    Res := Res + (X mod 10);
    X := X div 10;
  end;
  SumaCyfr := Res;
end;

var
  I : integer;
begin
  for I := 1 to 100 do
  begin
    if CzyPierwsza(I) and CzyPierwsza(SumaCyfr(I)) then
    begin
      Write(I, #32);
    end;
  end;
  Readln;
end.
AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Masz racje, już wszystko działa, ok mój błąd..

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

należałoby to oczywiście przyśpieszyć, choć tak z 10'000 razy :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.