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 19. 11. 2010 23:35

Majki
Příspěvky: 120
Reputace:   
 

pascal rozklad na prvocinitele

zdravím
v programování začínám
a mám za úkol udělat program: "na vstupu bude celé číslo větší než 1, na výstupu číslo rovná se jeho rozklad na součin prvočinitelů oddělených hvězdičkami. např. 75=3*5*5  "

zatím jsem se dostal k tomuhle a nevím jak dál

program rozklad_prvocisla;
var a,b,c:integer;
begin
readln(a);
b:=1;
write(a,'=');
if a>1 then repeat
        inc(b);
        until (a mod b)=0;
        if a=b then write(a)
        else begin
        c:=(a div b);
        write(c,'*');
        end;
end.


všem děkuji za hinty a ochotu
majki

Offline

  • (téma jako vyřešené označil(a) Majki)

#2 20. 11. 2010 12:28

vojta01
Příspěvky: 63
Reputace:   
 

Re: pascal rozklad na prvocinitele

Ahoj, tvůj program jsem podrobně nezkoumal, ale myslím, že nebude fungovat.
Algoritmus na rozložení na součin prvočísel funguje tak, že provádám cyklus while, dokud je zadané číslo větší jak 1 (ještě lze rozložit na součin). Mám vytvořenou proměnnou prvocislo, která má na začátku hodnotu 2. V každém průběhu cyklu zkousím (kolikrát to lze) vydělit zadané čislo hodnotou v proměnné prvocislo. Pokud zadané číslo je dělitelné hodnotou v proměnné prvocislo, pak vypíšu hodnotu proměnné prvocislo za zadané číslo nahradím podílem zadaného číslo hodnotou proměnné prvocislo. Na konci toho cyklu while zvětším hodnotu v proměnné prvocislo o 1 (pokud hodnota v proměnné prvocislo v nějakém průběhu cyklu while není prvočíslem, tak už určitě zadané číslo není dělitelné touto hodnotou, protože už bylo vyděleno všemi prvočísly tvořící prvočíselný rozklad hodnoty v proměnné prvocislo). Tento postup mi také zajistí, že se prvočísla vypíšou vzestupně, čímž je také mohu vypsal v podobě mocnin x^y. Hvězdičku na konci řádku si ošetři již sám (např tak, že si uděláž booleanovskou proměnou, pomocí které nevypíšeš první hvězdičku nebo zadané číslo nejprve vydělíš a pokud je zadané číslo rovno jedné, pak už hvězdičku nevypisuji). Program by šel ještě optimalizovat:

Code:

var cislo,prvocislo : integer;
...
begin
   readln(cislo);
   write(cislo,' = ');
   prvocislo := 2;
   while cislo <> 1 do {hlavní cyklus while, zadané číslo ještě pořád lze rozložit na nějaký součín prvočísel}
   begin
      while cislo mod prvocislo = 0 do {dokud je zadané číslo beze zbytku dělitelné akt. hodnotou v proměnné prvocislo}
      begin
         write(prvocislo, ' * ');
         cislo := cislo div prvocislo; {zadané číslo zmenším - vydělím ho jedním tím pročíslem, které jsem nyní vypsal}
      end;
      prvocislo := prvocislo + 1; {další zkoušení potenciální prvočíslo}
   end;
   writeln; {konec výpisu prvočísel}
end.

Offline

 

#3 20. 11. 2010 12:32

vojta01
Příspěvky: 63
Reputace:   
 

Re: pascal rozklad na prvocinitele

Ještě naznačím průbeh algoritmu:

cislo = 180;

   {prvocislo = 2}
180 mod 2 = 0   =>   vypiš dvojku, cislo=90
90 mod 2 = 0     =>   vypiš dvojku, cislo=45
45 mod 2 <> 0

   {prvocislo = 3}
45 mod 3 = 0     =>   vypiš trojku, cislo = 15
15 mod 3 = 0     =>   vypiš trojku, cislo = 5
5 mod 3 <> 0

   {prvocislo = 4}
5 mod 4 <> 0

   {prvocislo = 5}
5 mod 5 = 0       =>   vypiš pětku, cislo = 1, již nevypisuji hvězdičku, končím

Offline

 

#4 22. 11. 2010 12:24 — Editoval Majki (22. 11. 2010 13:00)

Majki
Příspěvky: 120
Reputace:   
 

Re: pascal rozklad na prvocinitele

↑ vojta01:
jak se prosimte zbavim te posledni hvezdicky
pro vstup napr. 28 mi to dava vystup 2*2*7*

pozn. nemusi mi odpovidat jen vojta mohou i jini uzivatele fora kteri jsou programatorsky zdatnejsi nez ja
dekuji

Offline

 

#5 22. 11. 2010 18:04

vojta01
Příspěvky: 63
Reputace:   
 

Re: pascal rozklad na prvocinitele

Ahoj, např. takto: Ve 2 (vnořeném) while-cyklu udělám toto:

Code:

begin
   cislo := cislo div prvocislo; {zadané číslo zmenším - vydělím ho jedním tím pročíslem, které jsem nyní vypsal}
   write(prvocislo);
   if(cislo > 1) {zadané číslo je větší než 1 a lze ještě dále rozkládat na součin prvočísel}
      write(' * '); {nula se nevypíše v případě, že cislo = 1   ==>  číslo už nelze rozkládat na součin prvočísel}
end;

Offline

 

#6 22. 11. 2010 20:24

Majki
Příspěvky: 120
Reputace:   
 

Re: pascal rozklad na prvocinitele

↑ vojta01:
supr presne tak to melo byt sice sem uz na to prisel ale na net sem se od te doby nedostal

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson