Kezdőoldal » Számítástechnika » Programozás » Tapasztalt programozók eszt...

Krisz2 kérdése:

Tapasztalt programozók eszt hogy oldanák meg?

Figyelt kérdés

A feladat az hogy írjunk egy programot ami kiszámítja egy szám faktoriálisát .Ezt én így oldottam meg:

int main()

{

long int n,a = 1;

cout << "Add meg a szamot:";

cin >> n;

int c[n];

for(int i = 1;i < n;i++)

{

c[i] = i;

a = a*c[i];

}

cout << "A faktorialisa: "<< a*n << "\n";

system("pause");

}

A kipróbált számokkal(5,10) működik.



2013. márc. 30. 18:30
 1/10 iostream ***** válasza:

Attól függ, milyen nyelvről beszélünk. C++-ban ez például invalid kód (az int c[n] miatt), és a cin/cout miatt úgy gondolom azt használsz.

Amúgy mivel a faktoriális egy értékből egy másikat állít elő, így felesleges letárolni a közbülső lépéseket (a c tömb úgy ahogy van felesleges, ha kiveszed, ugyanúgy fog működni).


Az elegáns megoldás meg attól függ.

Ha fordítási időben tudom, minek kell a faktoriálisa, akkor template metaprogramot írok.

Ha tudom, hogy intnél nagyobb faktoriális nem kell, akkor eleve le tudom tárolni egy táblázatban az összes lehetséges értéket, hiszen talán 72! már túlcsordulás. És akkor gyors lesz.

Ha valami bignumot használok, ami tetszőleges nagyságig felmegy, akkor is érdemes lehet letárolni az eddigi számolásokat, hogy legközelebb már onnan lehessen indulni. Elég minden 10. számot letárolni mondjuk, és akkor maximum 9 szorzást kell végrehajtani, ha már érintett számról van szó. Lehet zsonglőrködni a számokkal.

2013. márc. 30. 18:42
Hasznos számodra ez a válasz?
 2/10 anonim ***** válasza:

Külön procedúrában mindenképpen.

A tömböt pedig nem értem minek csináltad, nem használod később az elemeit. A ciklusba elég: a *= i

0!-al nem törődtél, fölötte jó eredményt ad.

2013. márc. 30. 18:42
Hasznos számodra ez a válasz?
 3/10 anonim ***** válasza:

1. Működik? Igen: 2 Nem: javítsd ki

2. Túl lassú? Igen: optimalizálj Nem: kész vagy


ennyi. Egy profi programozó is csak akkor optimalizál, ha van értelme. Ha valami lehetne ugyan gyorsabb, de a használatot ez egyáltalán nem nehezíti meg(a felhasználó számára nem látható a különbség), illetve plusz költségeket nem okoz, akkor nem kell optimalizálni.

2013. márc. 30. 18:42
Hasznos számodra ez a válasz?
 4/10 coopper ***** válasza:

Szia.


Miért kell bele a tömb ?


Simán is müködnie kell : a = a*i;


Igen, amúgy jó a megoldásod.


Üdv.

2013. márc. 30. 18:43
Hasznos számodra ez a válasz?
 5/10 iostream ***** válasza:
Sőt, többnyire már 13 faktoriális is túlcsordul 32 bites inten. 64 biten 20 faktoriális már túlcsordulás.
2013. márc. 30. 18:45
Hasznos számodra ez a válasz?
 6/10 anonim ***** válasza:
iostream ha fordítási időben tudod minek a faktoriálisa kell, akkor egy konstans teljesen elég. Talán annyit tennék, hogy egy külön eljárásba tenném, és utána hívom meg pl. faktorialis(5)-el.
2013. márc. 30. 18:52
Hasznos számodra ez a válasz?
 7/10 iostream ***** válasza:
De ha fordítási időben ismert, de nem számomra? Vagy változik idővel, én meg nem akarom mindig átírni a konstanst, csak az n-t? Tapasztalt programozó találkozott már ilyen dolgokkal, és szereti egyszerűsíteni az életét. Vagy ha több értékre is szükséged van, akkor bevezetsz Fact5, Fact11, Fact3 konstansokat, vagy leírod a használat helyén, hogy Fact<3>, Fact<11> stb? Szerintem az utóbbi elegánsabb.
2013. márc. 30. 18:56
Hasznos számodra ez a válasz?
 8/10 A kérdező kommentje:

1.Kösz

2.A progi elején ott vannak az include-ok(c++) csak nem írtam be

3.A nullát már kezeltem csak az van h suliba még nem tanultam uh. nem tudtam h 0!=1 de azóta elolvastam wikin

4.A tömböt akkor majd kiszedem belöle.

2013. márc. 30. 18:58
 9/10 iostream ***** válasza:
100%

Persze ilyen egyszerű dolgokra az új szabvány biztosítja a constexpr kulcsszót:


constexpr factorial (int n)

{

return n > 0 ? n * factorial( n - 1 ) : 1;

}

2013. márc. 30. 18:59
Hasznos számodra ez a válasz?
 10/10 anonim ***** válasza:

Ha nagy számok faktoriálisát akarod kiszámolni, akkor írj egy függvényt, ami stringeket szoroz, kb. ez alapján:

[link]

Néhány ezer jegyű számokat így is másodpercek alatt össze lehet szorozni, viszont a számítási nehézség négyzetesen nő, szóval 65000!-t már 20 perc volt kiszámolni...

2013. ápr. 1. 01:08
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!