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
Stránky: 1
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
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:
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
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
↑ 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
Ahoj, např. takto: Ve 2 (vnořeném) while-cyklu udělám toto:
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
↑ vojta01:
supr presne tak to melo byt sice sem uz na to prisel ale na net sem se od te doby nedostal
Offline
Stránky: 1