Hogy tudok ki íratni 100! körüli számot C-ben?
Double-be 100! körüli számot? És ezt hol álmodtad? :)
100! 157 számjegyet jelent, ezt az alap típusok nem képesek tárolni. A legegyszerűbb megoldás, ha leszedsz egy BigNum libet, ami lehetővé teszi bármekkora számok kezelését. A legnépszerűbb talán a GMP MP, de ha rákeresel Google-ben a BigNum libekre C nyelvhez, jópár találatot kapsz.
...és miért is kell ilyen hosszú számot kiíratni?
...mire a végére téved a szemed, már elfelejted az elejét... :-)
nem az a lényeg,hogy minek...ha nem íratom is ki..egy változóba elkell tárolni...és ha kiiratom 0-át ír ki. A programom:
Bekér 2 számot, N és M.
C = N! / ((N – M)! · M!)
és kiiratom a C-t.
Ha megadom, N = 100 és M = 6
az eredmény 0.
a többinél jó megoldást kapok.
You may assume that the final value of C will fit in a 32-bit signed integer (Pascal: longint, C: long).
Ez azt jelenti, hogy a 100! nem resze a feladatnak.
Amugy magas szintu nyelvek a verseny/targy neve, es nem Pythont hasznalsz?:)
C alatt en a Boost libet ajanlom, ha megis kellene bignum.
amint látod az egyik teszteset N bemenete 100, ami 100!. a programomban segéd változókat használok, és egy for ciklussal 1-N , 1-M és 1-(N-M) ig megy a ciklus, és így kiszámolom annak az értékét.
csak a 100 és 6 nál ad rossz eredményt.. biztos van más ilyen is, ez csak példa teszteset..
Ja, akkor csak a modszered nem tokeletes.
Ezt ugy kellene, hogy a programod kiegyszerusiti maganak a szamitast, es akkor ideiglenesen sem kell a 100!-t tarolni.
A leírásban nincs benne, hogy csak egészekkel dolgozhatsz, sőt az sem, hogy szükséged lesz a 100!-ra.
Ha megérted:
program verseny1;
{$APPTYPE CONSOLE}
uses SysUtils;
var N, M : Byte;
C : Double;
function Fact(Number: Byte): Int64;
begin
Result:= 1;
if Number > 0 then Result:= Fact(Number - 1) * Number;
end;
function Multiply(start, stop : Byte; mlp: Double ): Double;
var i : Byte;
begin
Result := mlp;
for i := start to stop do Result := Result * i;
end;
begin
N := 100;
M := 6;
C := Multiply(N - M + 1, N, 1 / Fact(M));
WriteLn(N, ' things taken ', M, ' at a time is ', C:0:0, ' exactly.');
ReadLn;
end.
"Double-be 100! körüli számot? És ezt hol álmodtad? :)"
Gondolom ezt te is tudod, úgyhogy már a kérdést sem értem. Leírtam, ~16 tizedesjegy pontossággal. IEEE 754 (azon belül is double) szabványban álmodták ezt meg egyébként, ahol 10^308 körül van a maximum érték. Mivel nem írta, hogy mihez kell, teljesen joggal gondoltam, hogy 16 tizedesjegy pontosság elég.
Az egyik példa bemenet a 100 6 ha nem látnátok. és arra a bemenetre a programom 0 át ír ki. Meg olyan számokra is, ami túl nagy.
A másik 2 bemenetre azt adja ki amit kell.
és ha nem is kell kiíratni a 100! hol tudok vele számolni segéd változók nélkül?
a faktoriálist for ciklussal csinálom meg, van ennél egyszerűbb módja?
konkrétan 3 for ciklust használok, és 3 segéd változót az N! (N-M)! és M! miatt.
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!