PDA

Prikaži potpunu verziju : Pomoc oko programa u jeziku C


darius
27.11.2015, 20:42
Pozdrav. Imam problema prilikom pisanja sledeceg programa. Program treba da za zadati broj n prikaze poslednje dve cifre faktorijala tog broja (dakle n!) kada se odbiju sve nule broja. Ukoliko faktorijal broja nema nule onda se prikazu poslednje dve cifre. Broj n je u opsegu od 1 do 10000. Ovako sam ja to pokusao da odradim:

#include <stdio.h>
#define MAX 10000
int fakt(int);

int main()
{
int n,x,y;
printf("\nBroj za koji zelite da se odredi faktorijal je ");
scanf("%d",&n);
y=fakt(n);
printf("\nFaktorijal iznosi %d\n\n",y);
if(y>10){
do{
y=y/10.;
}while(y%10==0);
}
x=y%100;
printf("\nZadnje dve cifre su %d\n",x);
return 0;
}

int fakt(int n)
{
if(n>1)
return n*fakt(n-1);
else
return 1;
}


Prilikom rada ovog programa uspevam da dobijem tacne vrednosti do faktorijala broja 12, vec za faktorijal 13 dobijam potpuno drugu vrednost a za faktorijal 17 je rezultat negativan. Da li postoji neki nacin koji bi omogucio da se ne racuna faktorijal do kraja (10000! je prilicno veliki broj) vec da se na neki nacin sam racun olaksa ? Ukoliko je n=7 tj. traze se poslednje dve cifre za faktorijal 7 sto je 5040, uspeva da ispise samo 4 a nulu ne uspeva da ispise. Primetio sam da se broj nula faktorijala povecava za 5 tako da od 0! do 4! nema nula, od 5! do 9! ima jedna nula, 10! do 14! ima dve nule itd.

Bilo koja pomoc i usmerenje su pozeljni.

ozzytheking
28.11.2015, 1:46
Ako je bilo kakva pomoc pozeljna, za pocetak ce ti biti korisna informacija o opsegu vrednosti koje celobrojna promenljiva moze da ima, u slucaju tvog programa u kome koristis int koji je 4-bajtna (32-bitna) promenljiva i posto je u pitanju oznaceni ceo broj tebi, je maksimalan broj koji moze da stane u taj tip podatka 2^31 - 1 tj. nesto oko 2 milijarde, pa ti zbog toga faktorijel funkcija radi za 12! posto je to manje od ~2 milijarde, a 13! (i vise) je vece pa dolazi do overflow-a.
Za pocetak mozes da zabranis unos vrednosti koje probijaju opseg. A mozes i da ga povecas koriscenjem neke vece celobrojne promenljive + koristi neoznacene promenljive da bi duplirao opseg (mada faktorijel jako brzo raste pa ti ovo ne pomaze mnogo), a i faktorijel je cisto pozitivna funkcija (zaje** Gama funkciju :D). Dakle unsigned long ili unsigned long long. Ali procitaj sledeci pasus prvo.

Ovde meni deluje kao da se zahteva neka malo naprednija logika za izvlacenje cifara faktorijela (posto prvo racunanje celog faktorijela pa tek onda gledanje cifara nece da ti radi jer za 10000!, ali i mnogo manje vrednosti, nema sanse da se izracuna i sacuva tako velika vrednost sa primitivnim tipovima podataka). Matematika mi nije na nesto naprednom nivou ali probaj nekako da izvedes formulu za izvlacenje cifara iz faktorijela nekog broja pa nju ubaci u kod. Ili cekaj nekog bistrijeg, mozda postoji neko jednostavno ali ne tako ocigledno resenje.
Prvo sto mi pada na pamet jeste da predstavis neki broj preko zbira njegovih znacajnih cifara pomnozenih stepenom broja 10 na odgovarajuci stepen (npr. 523 = 5*100 + 2*10 + 3*1) pa onda iz definicije faktorijela izmnozis sve cinioce i oslobodis se zagrada i vidis onda kako ti izgleda deo dobijene formule koji sadrzi boldovane sabirke, ... + <neki broj>*10 + <neki drugi broj>*1 i tako onda izvuces 2 najmladje cifre.

Poslednje dve cifre bilo kog broja mozes da izvuces pomocu "%" operatora jer ti je neki broj ABC...XYZ % 100 = YZ, a to su ti poslednje dve cifre broja. Tj. ako ti treba k poslednjih cifara radis moduo ("%") broja sa 10^k.
(Ovo ti kazem za neki problem gde se ovo trazi, za ovaj problem koji ti imas, treba mozda malo vise muke kao sto sam iznad napisao.)

I tema ti je u pogresnom podforumu. :D