Tapasztalt programozók eszt hogy oldanák meg?
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.
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.
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.
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.
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.
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.
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;
}
Ha nagy számok faktoriálisát akarod kiszámolni, akkor írj egy függvényt, ami stringeket szoroz, kb. ez alapján:
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...
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!