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 05. 12. 2009 13:27

rtio
Zelenáč
Příspěvky: 3
Reputace:   
 

Rozklad na prvočinitele v C++

Nevím si rady s tímto příkladem:

Mám napsat program, který vypíše rozklad daného přirozeného čísla z intervalu 2 do
10000, včetně, na prvočinitele. Po spuštění programu, uživatel zadá číslo a
program vytiskne příslušný rozklad.

Kdyby se někdo našel byl bych moc rád, docela v tom plavu.

Offline

 

#2 05. 12. 2009 13:41 — Editoval gladiator01 (05. 12. 2009 13:43)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Rozklad na prvočinitele v C++

třeba takhle, ale jde to i jinak:

Code:

#include<iostream> 

using namespace std;

void Rozklad(int hodnota)
{
    int delitel=2;
    if(hodnota>1)
    {
       while(hodnota%delitel !=0)
          delitel++;
       cout << delitel << " ";
       Rozklad(hodnota/delitel);
    }
}

int main()
{
  int x=0;
  cout << "Zadej cislo <2-10 000>: ";
  cin >> x;
  
  Rozklad(x);
  cout << endl;
   
  system("pause");
  return 0;
}

Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#3 05. 12. 2009 13:56

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Rozklad na prvočinitele v C++

Drobné zrychlení dosáhneme, když zrušíme rekurzi a nebudeme možné dělitele procházet vždy znovu od dvojky:

Code:

void Rozklad(int hodnota)
{
    int delitel=2;
    while(hodnota>1)
    {
       while(hodnota%delitel !=0)
          delitel++;
       cout << delitel << " ";
       hodnota=hodnota/delitel;
    }
}

Další zrychlení (netestovat sudé dělitele větší než 2, ...) mohou prodloužit kód.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#4 05. 12. 2009 16:54

Olin
Místo: Brno / Praha
Příspěvky: 2823
Reputace:   81 
 

Re: Rozklad na prvočinitele v C++

Testoval bych dělitelnost jen po odmocninu, tím se to zrychlí zejména pro velká prvočísla.


Matematika = královna věd. Analýza = královna matematiky. (Teorie množin = bohatství matematiky.)
MKS Náboj iKS

Offline

 

#5 08. 12. 2009 11:14 — Editoval zlamal89 (08. 12. 2009 11:15)

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Rozklad na prvočinitele v C++

Autor zapomel dodat ze by mel vystup vypadat nejak takhle
2 = 2^1
3 = 3^1
4 = 2^2
5 = 5^1
6 = 2^1 * 3^1
7 = 7^1
8 = 2^3
9 = 3^2
10 = 2^1 * 5^1
11 = 11^1
12 = 2^2 * 3^1
.....
1768 = 2^3 * 13 * 17
.....
10000 = 2^4 * 5^4
a to uz nevim ani ja jak napsat:D jestli nekdo vi tak mi pls poradte muzete i mail zlamal89@seznam.cz

Offline

 

#6 08. 12. 2009 11:29

Olin
Místo: Brno / Praha
Příspěvky: 2823
Reputace:   81 
 

Re: Rozklad na prvočinitele v C++

Stačí si pamatovat, kolikrát už jsme měli to dané prvočíslo. Výhodné může být to, že výše popsané algoritmy vypisují ta prvočísla setříděně od nejmenšího po největší.


Matematika = královna věd. Analýza = královna matematiky. (Teorie množin = bohatství matematiky.)
MKS Náboj iKS

Offline

 

#7 08. 12. 2009 11:39 — Editoval zlamal89 (08. 12. 2009 11:40)

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Rozklad na prvočinitele v C++

POrad nevim jak to napsat jsem pouhy zacatecnik a jeste toho moc neumim:D moc prosim lidi pomozte mi

Offline

 

#8 08. 12. 2009 17:01 — Editoval gladiator01 (08. 12. 2009 20:18)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Rozklad na prvočinitele v C++

Tady jsem něco sesmolila, doufám, že mě Kondr neukamenuje.
Pro některá čísla mi nechtěl fungovat výpis proto to je takové zvláštní.

Code:

void Rozklad(int hodnota)
{
    int p[50][2];
    int pocet=0,i=0,h=0;
    int delitel=2;
    if(hodnota==4)
      cout << "2^" << "2";
    if(hodnota%2==0) //když rozklad začíná na 2
    {
      p[0][0]=delitel;
      p[0][1]=pocet;
      i=1;
      pocet=0;
    }
    while(hodnota>sqrt(delitel))
    {
       while(hodnota%delitel!=0)
       {
          delitel++;
          pocet=0;
       }
       pocet++;
       p[i][0]=delitel;
       p[i][1]=pocet;
       if(hodnota%delitel==0)
         i++;
       hodnota=hodnota/delitel;
    }
    for(int j=0; j<i; j++)
    { 
       if(p[j][0]!=p[j+1][0])
          cout << p[j][0] << "^" << p[j][1] << " * ";
    }
}

Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#9 08. 12. 2009 20:13

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Rozklad na prvočinitele v C++

Dik za snahu ale nejede ti to mas tam nejake errory 7 a 15 radek:-) ale jinak dobre

Offline

 

#10 08. 12. 2009 20:18 — Editoval gladiator01 (08. 12. 2009 20:22)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Rozklad na prvočinitele v C++

mě to funguje

nezapomněl jsi si přidat knihovnu math.h kvůli fci sqrt (u prvního while)?

co ti to hlásí?


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#11 08. 12. 2009 21:02

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Rozklad na prvočinitele v C++

To bude ono presne tak neamm tam tu knihovnu protoze jsem ji jeste nikdy nevidel to bude tim:D, rikam ze jsem zacatecnik a bereme poze zaklady potreboval bych to napsat jenom v C a ne v C++ a trosicku logicteji protozne v tomhle se moc nevyznam

Offline

 

#12 08. 12. 2009 21:04

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Rozklad na prvočinitele v C++

↑ gladiator01:kamenovat se nebude, ale ten program má mouchy ... rozhodně místo
    while(hodnota>sqrt(delitel))
má být
    while(hodnota>=delitel*delitel)

Proč se dvojka řeší zvlášť? K čemu test  if(hodnota%delitel==0) (to musí být splněné kvůli while cyklu) Proč se u sudžch čísel podruhé inicializuje pocet na 0? Co to udělá pro čísla dělitelná 4?


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#13 08. 12. 2009 21:37 — Editoval gladiator01 (08. 12. 2009 21:42)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Rozklad na prvočinitele v C++

Je to celé nějaké vadné.

to if(hodnota%delitel==0)  je tam opravdu k ničemu

Tohle tam je protože když dám 12 tak se mi rozklad nevypíše (částečně).

Code:

 
    if(hodnota%2==0) 
    {
      p[0][0]=delitel;
      p[0][1]=pocet;
      i=1;
    }

Code:

void Rozklad(int hodnota)
{
    int p[50][2];
    int pocet=0,i=0,h=0;
    int delitel=2;

    if(hodnota%2==0) //když rozklad začíná na 2
    {
      p[0][0]=delitel;
      p[0][1]=pocet;
      i=1;
    }


    while(hodnota>1)
    {
       while(hodnota%delitel!=0)
       {
          delitel++;
          pocet=0;
       }
       pocet++;
       p[i][0]=delitel;
       p[i][1]=pocet;
       i++;
       hodnota=hodnota/delitel;
    }
    for(int j=0; j<i; j++)
    { 
       if(p[j][0]!=p[j+1][0])
          cout << p[j][0] << "^" << p[j][1] << " * ";
    }
}

Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#14 12. 12. 2009 15:37

mobby
Zelenáč
Příspěvky: 2
Reputace:   
 

Re: Rozklad na prvočinitele v C++

Zdravím vás :)

mám obdobný problém s tím že bych tam měl zakomponovat prvočísla do 10000 (které si vypočítám na začátku nebo napevno z pole nebo ze souboru) a vůbec nevím jak na to sem začatečník :(

Tady přikládám kompletní zadání projektu který mám udělat ... kdyby mi stím někdo pomohl nebo poradil zda stačí nejak přepsat kod který je výš, prosím ?

http://forum.matweb.cz/upload/1260628407-zadani.jpg

Offline

 

#15 12. 12. 2009 20:21

mobby
Zelenáč
Příspěvky: 2
Reputace:   
 

Re: Rozklad na prvočinitele v C++

Zkusil jsem kod (který je víš) předělat aby to používalo prvočísla zadané v poli (zmenšil sem aspon na ted rozsah do 100) ale to by přece nemělo mít žádný vliv na funkčnost a přesto mi některé čísla jako je 64 nebo 84 nefungují nevíte kde je chyba??

Code:

# include <stdio.h>
# include <iostream>
    using namespace std;
# include <iomanip>


int const PP =25;


void Rozklad(int hodnota)
{
    int p[50][2];
    int pocet=0,i=0,h=0,z=0;
    int delitel=2;
    int pole[PP] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};


    if(hodnota%2==0) //když rozklad začíná na 2
    {
      p[0][0]=pole[z];
      p[0][1]=pocet;
      i=1;
    }


    while(hodnota>1)
    {
       while(hodnota%pole[z]!=0)
       {
          z++;
          pocet=0;
       }
       pocet++;
       p[i][0]=pole[z];
       p[i][1]=pocet;
       i++;
       hodnota=hodnota/pole[z];
    }
    for(int j=0; j<z; j++)
    { 
       if(p[j][0]!=p[j+1][0])
          cout << p[j][0] << "^" << p[j][1] << " * ";
    }
}

int main()
{
  int x=0;
  cout << "Zadej cislo <2-100>: ";
  cin >> x;
  
  Rozklad(x);
  cout << endl;
   
  system("pause");
  return 0;
}

Offline

 

#16 12. 12. 2009 21:21 — Editoval Kondr (08. 12. 2010 14:06)

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Rozklad na prvočinitele v C++

↑ mobby: Jak jsem psal, ten původní kód má mouchy. Trochu jsem ho opravil:

Code:

void Rozklad(int hodnota)
{
    int pole[PP] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
    int z = 0; //inicialni index prvocisla
    while(hodnota > 1) //postupne delime, dokud nesnizime hodnotu na 1
    {
       while(hodnota%pole[z]!=0) //preskocime prvocisla, ktera hodnotu nedeli
       {
          z++;
       }
       int stupen = 0;
       delitel = z<25 ? pole[z] : hodnota; //pokud musime delit prvocislem mimo pole, je prvocislem sama hodnota
       while(hodnota % delitel == 0) //prvocislem, ktere hodnotu deli, delime dokud lze
       {
                  stupen++;
                  hodnota=hodnota/pole[z];
       }
       cout << pole[z] << "^" << stupen << (hodnota>1?"*":"");   //za poslednim cinitelem nevypisujeme *   
    }
}

BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#17 17. 12. 2009 20:44

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Rozklad na prvočinitele v C++

Dekuji vsem moc za ochotu a za pomoc. Uz jsem si to dokazal napsat sam a docela lechce, ale bez napadu tady bych to nedokazal

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson