Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Delphi] Liczba jako iloczyn potęg liczb pierwszych...

Ostatnio zmodyfikowano 2017-10-30 01:30
Autor Wiadomość
CPnHorror
Temat założony przez niniejszego użytkownika
[Delphi] Liczba jako iloczyn potęg liczb pierwszych...
» 2017-10-30 00:31:34
Zadanie: Każda liczba całkowita może być jednoznacznie rozłożona na iloczyn potęg liczb pierwszych.

no to walczę..

                                 //zmienne
    prime: array[1..100] of integer;      // liczby pierwsze
    number: array[1..1000] of integer;    // liczby
    i,i2: integer;
    n: integer;  // liczba ktora rozkladamy
    licznik: integer;  // licznik ile jest pierwszych

kod buttona


             n:=StrToInt(Edit1.Text);


              number[1]:=0;
            for i:=2 to n do ;
              begin
                  number[i]:=1;
              end;
                     for i:=2 to Round(sqrt(n)) do
                      begin
                          for i2:=i+1 to n do
                            begin
                              if(i2 mod i = 0)
                                then
                                  begin
                                    number[i2]:=0;
                                  end;

                            end;
                      end;

                              licznik:=1;
                                    for i:=1 to n do
                                      begin
                                        if(number[i]=1) then
                                          begin
                                             prime[licznik]:=i;
                                             licznik:=licznik+1;
                                          end;
                                      end;

                     while n>1 do
                      begin
                        for i2:=1 to licznik-1 do
                          begin
                            if((n mod prime[i2]) = 0)
                              then
                                begin
                                n:=n div prime[i2];
                                ListBox1.Items.Add(IntToStr(prime[i2]));
                                break;
                                end;

                          end;
                      end;

chciałem wypisać wszystkie dzielniki pierwsze liczby a powtarzające się zgromadzić do tablicy przechowującej wartość potęgi .. dobre podejście ?
rozważałem jeszcze jedno acz to wydaje się najbardziej wydajne dla wielkich liczb.
P-166228
pekfos
» 2017-10-30 00:36:04
//n:=n/prime[i2];                  // tutaj wyskakuje error, że "n/prime[i2] to extended ( (rzeczywista??) :O )
Bo dzielenie całkowite to div.
P-166229
CPnHorror
Temat założony przez niniejszego użytkownika
» 2017-10-30 00:44:30
nie rozumiem.

napisałem program, który przechowuje w tablicy "prime", "licznik-1" liczb pierwszych.
sprawdza następnie liczbę n przez jakie liczby "prime" dzieli się bez reszty i powinien je wypisać do ListBoxa.


program się craszuje a ja nie mogę podzielić liczby n przez jej dzielnik, który jest liczbą pierwszą;


                  while n>1 do
                      begin
                        for i2:=1 to licznik-1 do
                          begin
                            if((n mod prime[i2]) = 0)   //prime dzieli bez reszty
                              then
                                begin
                                //n:=n/prime[i2];       // dlaczego przez prime nie moge podzielić ? skoro 9%3 = 0 to dlaczego nie mogę 9/3 całkowicie ?
P-166230
pekfos
Czy ja piszę do człowieka..?
» 2017-10-30 00:56:56
n := n div prime[i2];
P-166231
CPnHorror
Temat założony przez niniejszego użytkownika
» 2017-10-30 00:59:06
zrobiłem tak.
program się craszuje, zużycie procesora 100 % oraz pracuje w nieskończoność.

gdy wprowadzę n = 10.. to jest koniec.
P-166232
pekfos
» 2017-10-30 01:09:14
No niesamowite po prostu. To w końcu się craszuje, czy działa w nieskończoność? Z pewnością dla Delphi nie istnieje żaden debugger i żadną metodą nie jesteś w stanie sprawdzić, czemu ten krótki algorytm robi pętlą więcej niż kilka obrotów.
P-166233
CPnHorror
Temat założony przez niniejszego użytkownika
» 2017-10-30 01:18:02
to może wydawać się głupie ale...
zwrot prime crashował.
nie wiem dlaczego, być może to nazwa zastrzeżona choć nie podkreśla jej.
Pefkos dzięki za pomoc, div wielce się przydało. (trochę to głupie to dzielenie w delphi.. ale no cóż poradzić)



program działa cały kod umieszczę za chwilę, gdy go dopracuję estetycznie.
P-166234
CPnHorror
Temat założony przez niniejszego użytkownika
KOD SPRAWNY PROGRAMU
» 2017-10-30 01:30:14
ZMIENNE

      n,i,i2,licznik: integer;
      pierwsze: array[1..500] of integer;
      number: array[1..5000] of integer;



BUTTON

n:=StrToInt(Edit1.Text);
  ListBox1.Clear;

      for i:=0 to n do
        begin
            number[i]:=1;
        end;
               for i:=2 to Round(sqrt(n)) do
                begin
                    for i2:=i+1 to n do
                      begin
                        if(i2 mod i = 0)
                          then
                            begin
                              number[i2]:=0;
                            end;

                      end;
                end;

                    licznik:=1;
                              for i:=2 to n do
                                begin
                                  if(number[i]=1) then
                                    begin
                                       pierwsze[licznik]:=i;
                                       licznik:=licznik+1;
                                    end;

                                end;


                  while n>1 do
                      begin
                        for i2:=1 to licznik-1 do
                          begin
                            if((n mod pierwsze[i2]) = 0)
                              then
                                begin
                                n:=n div pierwsze[i2];
                                ListBox1.Items.Add(IntToStr(pierwsze[i2]));
                                break;
                                end;

                          end;
                      end;
P-166235
« 1 »
  Strona 1 z 1