Miért bugos a programom?
Feladat: Adjuk össze egy legfeljebb 100 jegyű természetes szám számjegyeit! Ha a kapott szám nem egyjegyű, akkor ennek újra adjuk össze a számjegyeit, s az eljárást folytassuk, amíg egyjegyű számot nem kapunk. Egyes kiinduló számok esetén a végeredmény 1 lesz. Nevezzük ezeket a kiinduló számokat "egyes" számoknak.
Készíts programot, amely beolvas egy természetes számot, majd kiírja, hogy a szám "egyes" szám-e!
Program:
#include <stdio.h>
int main() {
int a, b = 0, c = 0;
printf("Adj meg egy szamot!");
scanf_s("%d", &a);
while (a >= 10) {
while (a > 0) {
b = a % 10;
a = a / 10;
c = c + b;
}
a = c;
c = 0;
}
printf ("%d",a);
if (a == 1) {
printf("EGYES");
}
return 0;
}
Probléma: 13, vagy több karakterű számoknál rosszul adja az eredményt. Mi lehet az oka?
Az az oka, hogy a C integerje 2-4 bites:
Egy 100 jegyu szamot csakis tombben tudsz tarolni. Ez lehet char tomb (es akkor a karaktert szamma alakitod, ezeket szummazod), vagy lehet short int tomb - igy csak a tomb elemeit kell szummazni.
Pontosítanék a válaszon. Az int típusra csak annyi megkötés van hogy legalább 2 bájtnak kell lennie. A méretét a fordítók választják meg célszerűen úgy, hogy az megegyezzen az architektúra szó méretével, azaz a regiszterek méretével amire általában optimalizálják a CPU egyes műveleteit, ezzel nagy sebességet elérve. 16 bites CPU-n ez 16 bit, 32 bites CPU-n ez 32 bit, és 64 bites CPU-n lehet láttam már 32 és 64 bitesnek is (valószínűleg hogy visszafelé kompatibilis legyen a kód). Ha nem számít a memória, érdemes mindig int típust használni a számításokhoz.
Ha ez nem elég, akkor használhatod a long long int típust ami legalább 64 bites (C99-től), vagy akár te is megadhatod az int méretét, az stdint.h headerben deklarált típusok egyikével ( [link] ).
Ha ennél nagyobb kell akkor léteznek bigint könyvtárak pl. GMP ( [link] ) amiben nincs limitáció a méretre, viszont használata körülményesebb és sokkal lassabb.
A beépített egész típusok méretei a limits.h headerben van definiálva amit megnézhetsz itt:
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!