liczba fermata

0

Czy może ktoś mie powiedzieć dlaczego ten program nie działa tak jak powinien??
Jak zrobiłem bez petli for to wszystko działało tylko że wtedy musiałem w kodzie pisać jaką liczbę ma sprawdzać. Więc prawdopobnie źle wplotłem w to zadanie w pętle for.

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils,Math;
var
x,b,n,a,c:longint;

begin
b:=2;
a:=3;
c:=18;
n:=0;

for a:=a+1 to c do
begin
x:=a;
if x mod b =0 then
writeln('nie jest pierwsza')
else
readln;
writeln(' jest pierwsza'+inttostr(x));

 repeat
  n:=n+1;
  if x<>power(2,power(2,n))+1 then
  continue
  else
  writeln('to jest fermat');

 until   n>x;

readln;
end;
readln;
{ TODO -oUser -cConsole Main : Insert code here }
end.

Na razie moze nie patrzmy na to ze np w momencie gdy liczba nie jest pierwsza to ma sprawdzac kolejna a nie od razu przechodzic do fermata niech wszystko wywala na ekran, na razie niech tylko działa poprawnie.

0

Kilka dni temu ten problem tu był. Te liczby są bardzo duże i argument chyba nie przekracza liczby pięć. Po pierwsze sprawdzając w prosty sposób musisz dodać obsługę wyjątków żeby był komunikat, że jest poza zakresem liczb całkowitych kompilatora. Po drugie nie możesz używać power bo on podaje niedokładne wyniki, ponieważ liczy na liczbach rzeczywistych. Żeby liczyć potęgę liczb całkowitych musisz zrobić pętlę w której wielokrotnie będziesz mnożył liczbę całkowitą przez siebie. Zakres pętli będzie zmienny w zależności od wykładnika. Po trzecie, jeśli zakres liczb całkowitych kompilatora jest niewystarczający (maksymalnie kilka miliardów) to musisz użyć biblioteki do obliczeń na bardzo dużych liczbach całkowitych. Są gotowe biblioteki a w tym wypadku może napisałbyś to sam i wystarczyłoby w tablicy liczb zawierających 0 i 1 przesuwać liczby o jedno miejsce (mnożenie przez dwa) no i jeszcze pozostaje kwestia zamiany liczby dziesiętnej na dwójkową i z powrotem tak, żeby poszczególne części tej zamiany na pewno nie zawierały dużych liczb ( żeby nie wyszło poza dopuszczalny zakres liczb całkowitych kompilatora). Po czwarte nie bardzo podoba mi się zapis for a:=a+1 ... być może on jest zgodny z zasadami języka jednak wolałbym użyć innej zmiennej np for b:=a+1...

0

Jestem noga z matymy, ale podejrzewam, że pytającemu chodzi o taki kod jak poniżej. W standardowych typach liczbowych oraz
tylko dla liczb pierwszych, liczby Fermata będą zaledwie trzy czyli 1, 2 i 3. A na przyszłośc formatuj kod po ludzku i po ludzku tez
nazywaj zmienne to się zoarientujesz co i jak. Bo przy więcej niż jeden instrukcji po if ... then, ujmujemy blok w begin oraz end;

program liczby_fermata;

{$APPTYPE CONSOLE}

function Potega(Podst, Wykl : integer) : integer;
var
  i, Wynik : Integer;
begin
  Wynik := 1;
  for i := 1 to Wykl do
    Wynik := Wynik * Podst;
  Potega := Wynik;
end;

function CzyPierwsza(Liczba : integer) : boolean;
var
  I : integer;
begin
  CzyPierwsza := True;
  for I := 2 to Liczba - 1 do
  begin
    if Liczba mod I = 0 then
    begin
      CzyPierwsza := False;
      Break;
    end;
  end;
end;

function LiczbaFermata(N : Byte) : Cardinal;
begin
  LiczbaFermata := Potega(2, Potega(2, N)) + 1;
end;

const
  Max = 4;
var
  I : Cardinal;
begin
  for I := 1 to Max do
    if CzyPierwsza(I) = True then
      Writeln('  ', I, ' jest liczba pierwsza (licza Fermata: ', LiczbaFermata(I), ').');
  Readln;
end.

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