C-ben sok szám szorzása? Érték és kiíratás, hogyan?
algoritmus példa, csak meg akarom csinálni c-ben.
első 25 szám szorzata...
röviden a hibajelenség..
int a
int szam
<szorozgatom ciklussal stb. a 1-25>
printf ("%d",szam)
nem írja ki csak 11-12 számjegyig aztán össze vissza ír mindent...
segítsetek lécci.
Az int értékkészlete [−32767,+32767], egyszóval túlcsordul az eredmény.
Int helyett unsigned long long int típus kell neked.
Nem lesz jó az unsigned long, mert annak is túl kicsi az értékkészlete.
Vagy a double lesz jó, vagy a speciálisan erre a célra való, sokszámjegyes típusok (tegyük hozzá, pusztulat lassúak). Most nem tudom hirtelen, hogy C-hez van-e ilyen, de szerintem kell, hogy akadjon. Ha nincs, akkor sajna implementálni kell - vagy megmaradni a double képességeinek határain belül.
Igen :)
Viszont megnéztem gyorsan, mit tud a double. 170 faktoriálisig lehet stresszelni, viszont azt még elfelejtettem ideírni, hogy a printf-nél vigyázni kell, mert ha a formátum "%d", akkor a kiírt eredmény helytelen lesz. Helyette a "%.0f" megoldást javaslom.
Valahogy így (stdio.h kell hozzá):
void main(int argc, char *argv) {
˙˙˙˙double result = 1.0;
˙˙˙˙int target = atoi(argv[1]);
˙˙˙˙int i;
˙˙˙˙for (i = 1; i <= target; i++) {
˙˙˙˙˙˙˙˙result *= i;
˙˙˙˙}
˙˙˙˙printf("%.0f\n", result);
};
Paranccsor: demo.exe 25
"Viszont megnéztem gyorsan, mit tud a double. 170 faktoriálisig lehet stresszelni"
Nem akarom kipukkasztani a buborékodat, de a double is csak 64 bit, tehát nem fog tudni többféle számot tárolni, mint egy akármilyen más 64 bites szám (sőt, a mindenféle speciális értékek miatt egy 64 bites kettes komplemensű integerben többféle érték tárolható). Tehát ha nagy a karakterisztika (a hatvány része a lebegőpontosnak, ami kb egy normál alakot jelent), akkor pontatlan lesz a szám.
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!