Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 31. 10. 2010 21:58

Mr.Pinker
Příspěvky: 542
Reputace:   12 
 

faktoriál v pascalu

jde nějak zadefinovat faktoriál v pascalu ?

Offline

 

#2 31. 10. 2010 22:17

Oxyd
Příspěvky: 614
Škola: MFF UK, teoretická informatika
Pozice: Student
Reputace:   31 
 

Re: faktoriál v pascalu

Ano, jde to. Výpočet faktoriálu je algoritmicky řešitelný problém a Pascal je Turing-kompletní jazyk -- takže se v Pascalu dá spočítat faktoriál.

Například takhle:

Code:

function factorial(n : integer) : longint;
begin
  factorial := 1;
  while n >= 1 do
    begin
      factorial := factorial * n;
      dec(n)
    end
end;

Ovšem dost rychle se ti stane, že se výsledek nevejde do jednoho longintu.

Skrývá se za otázkou nějaký hlubší problém, nebo jsem ti jenom vyřešil domácí úlohu z prográmka?


Mýlím se častěji, než bych chtěl. Pokud vám v mém příspěvku něco nehraje, neváhejte se zeptat.
Jsem stále mlád a je mi příjemnější tykání. :)

Offline

 

#3 31. 10. 2010 22:19

Mr.Pinker
Příspěvky: 542
Reputace:   12 
 

Re: faktoriál v pascalu

↑ Oxyd:
no chci udělat program na zjištování prvočísel

Offline

 

#4 31. 10. 2010 22:27

Oxyd
Příspěvky: 614
Škola: MFF UK, teoretická informatika
Pozice: Student
Reputace:   31 
 

Re: faktoriál v pascalu

↑ Mr.Pinker:

Aha. To ale nevidím, k čemu tam potřebuješ faktoriál. Můžeš to zkusit nějak vysvětlit?


Mýlím se častěji, než bych chtěl. Pokud vám v mém příspěvku něco nehraje, neváhejte se zeptat.
Jsem stále mlád a je mi příjemnější tykání. :)

Offline

 

#5 31. 10. 2010 22:29 — Editoval Mr.Pinker (31. 10. 2010 22:30)

Mr.Pinker
Příspěvky: 542
Reputace:   12 
 

Re: faktoriál v pascalu

no chtěl sem použít wilsonovou větu a pokud platí tak číslo je prvočíslo a pokud ne tak není ale nějak sme se do toho zamotal

Offline

 

#6 31. 10. 2010 22:58

Oxyd
Příspěvky: 614
Škola: MFF UK, teoretická informatika
Pozice: Student
Reputace:   31 
 

Re: faktoriál v pascalu

Jo takhle. To by určitě fungovalo, máš pravdu.

Ovšem -- jakmile dostaneš ne moc velké číslo -- třeba 1000 --, tak už se ti nevejde do žádného vestavěného datového typu a budeš muset použít takové věci jako dlouhá čísla, abys vůbec mohl (p - 1)! uložit v paměti.

Snažší a výpočetně méně náročný přístup je ten daleko přímější: Když máš na vstupu číslo p a chceš otestovat, jestli je prvočíslo, pak stačí projet všechna čísla od 2 do p - 1 a pokud některé z nich dělí p, pak p není prvočíslo.

Ostatně, nemusíš projíždět čísla až do p - 1 -- stačí poslední zkoušené číslo zvolit daleko nižší. Zkus se zamyslet jak.

Jestli a dělí b se dá zjistit pomocí operace „zbytek po dělení“, která se v Pascalu dělá operátorem mod. Například 5 mod 2 = 1, 6 mod 3 = 0.


Mýlím se častěji, než bych chtěl. Pokud vám v mém příspěvku něco nehraje, neváhejte se zeptat.
Jsem stále mlád a je mi příjemnější tykání. :)

Offline

 

#7 01. 11. 2010 18:38

Mr.Pinker
Příspěvky: 542
Reputace:   12 
 

Re: faktoriál v pascalu

no tak stačí dělit prakticky jenom čísla do p/2 ne ?

Offline

 

#8 01. 11. 2010 18:47

jarrro
Příspěvky: 5465
Škola: UMB BB Matematická analýza
Reputace:   303 
Web
 

Re: faktoriál v pascalu

↑ Mr.Pinker:stačí do $\sqrt{p}$


MATH IS THE BEST!!!

Offline

 

#9 01. 11. 2010 19:07

Mr.Pinker
Příspěvky: 542
Reputace:   12 
 

Re: faktoriál v pascalu

a co je na tomhle špatně že mi stále vypisuje ne

Code:

program prvocislo;
var a,b,c,n:integer;
begin
read(a);
b:=a div 2;
while a>=b do
repeat
c:=a mod b;
b:=b+1;
until b>a;
if c=0 then
writeln('ne')
else
writeln('ano');
end.

Offline

 

#10 01. 11. 2010 19:24

vojta01
Příspěvky: 63
Reputace:   
 

Re: faktoriál v pascalu

Ahoj, ta metoda s wilsonovou větou je sice teoreticky neefektivnější, ale i pro poměrně malá čísla je problém v obrovské hodnotě faktoriálu.
Pro zjišťování, zda je jedno číslo prvočíslem je prakticky nejlepší tedy vyzkoušet, zda je dělitelné dvojkou a všemi lichými čísly od 3 do odmocniny z testovaného čísla.
Pokud však chceš určit např. prvních 100 prvočísel nebo všechna prvočísla menší jak 100, pak je nejefektivnější tzv. eustachovo síto, viz Google :)

Offline

 

#11 01. 11. 2010 19:31

Mr.Pinker
Příspěvky: 542
Reputace:   12 
 

Re: faktoriál v pascalu

↑ vojta01:
neomhl by si mi prosím tě tedy říct v čem je chyba v tom mém programu proč mi to i prvočísla píše ne ?

Offline

 

#12 01. 11. 2010 19:47

vojta01
Příspěvky: 63
Reputace:   
 

Re: faktoriál v pascalu

Ahoj, nepochopil jsem, jak funguje ten tvůj program, já bych to napsal takto:

program prvocislo;
var cislo,i : integer;
      prvocislo : boolean;
begin
   readln(cislo);
   prvocislo := true;
   if cislo <= 1 then {jednička, nula nebo záporné číslo není prvočíslo}
      prvocislo := false;
   if (cislo <> 2) AND (cislo mod 2 = 0) then {zadané číslo není dvojka a je sudé a proto není prvočíslo}
      prvocislo := false;
   else {zadané číslo je liché}
   begin
      i := 3;
      while i <= sqrt(cislo) do
      begin
         if cislo mod i = 0 then {zadané číslo je dělitelné číslem i a proto není prvočíslo}
         begin
            prvocislo := false;
            {ukonči cyklus while - něco jako v c++ break, není to však nutné}
         end
         i := i+2; {zvětší o dvojku potenciálního dělitele}
      end;
   end;
   if prvocislo = true then
      writeln('ANO');
   else
      writeln('NE');
   readln;
end.

Offline

 

#13 02. 11. 2010 06:57

Honzc
Příspěvky: 4549
Reputace:   241 
 

Re: faktoriál v pascalu

↑ vojta01:
Eustachova je trubice síto je Eratosthenovo.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson