[Delphi] Liczba jako iloczyn potęg liczb pierwszych...
Ostatnio zmodyfikowano 2017-10-30 01:30
TenTyp 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. |
|
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. |
|
TenTyp 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 ?
|
|
pekfos |
Czy ja piszę do człowieka..? » 2017-10-30 00:56:56 n := n div prime[i2]; |
|
TenTyp 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. |
|
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. |
|
TenTyp 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. |
|
TenTyp 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;
|
|
« 1 » |