Pagini recente » Cod sursa (job #1084368) | Cod sursa (job #2265641) | Cod sursa (job #364303) | Cod sursa (job #1749465) | Cod sursa (job #879309)
Cod sursa(job #879309)
#include <cstdio>
//Lungimea maxima a unui numar mare
#define l_max 300
//Un numar mare
struct mare
{
short int v[l_max];
};
//Functia de maxim
int maxim(int a,int b)
{
if(a>b)
return a;
return b;
}
//Functiile specifice unui numar mare
void init(mare &a)
{
int i;
for(i=0;i<l_max;i++)
a.v[i]=0;
}
mare suma(mare &a,mare &b)
{
mare aux;
init(aux);
aux.v[0]=maxim(a.v[0],b.v[0])+1;
int i;
int transport=0;
for(i=1;i<=aux.v[0];i++)
{
aux.v[i]=a.v[i]+b.v[i]+transport;
transport=aux.v[i]/10;
aux.v[i]%=10;
}
while(aux.v[aux.v[0]]==0)
{
aux.v[0]--;
}
return aux;
}
void afis(mare &a)
{
int i;
for(i=a.v[0];i>0;i--)
printf("%hd",a.v[i]);
printf("\n");
}
void init_scalar(mare &a,int x)
{
while(x>0)
{
a.v[a.v[0]+1]=x%10;
a.v[0]++;
x/=10;
}
}
int main()
{
//Deschiderea fisierelor de intrare si iesire
freopen("nunta.in","r",stdin);
freopen("nunta.out","w",stdout);
//n - al catelea termen al Sirului lui Fibonacci trebuie cautat
int n;
//Citim n
scanf("%d",&n);
//Cele doua cazuri de baza, particulare
if(n==1)
{
printf("1\n");
return 0;
}
else if(n==2)
{
printf("2\n");
return 0;
}
//Cele trei numere mari ce vor fi folosite pentru calculul iterativ al termenului curent al Sirului lui Fibonacci
mare a,b,c;
//Le initializam pe primele doua cu 0
init(a);
init(b);
//Le initializam pe primele doua cu 1 respectiv 2
init_scalar(a,1);
init_scalar(b,2);
//i - contor
int i;
//Calculam al n-lea numar Fibonacci
for(i=2;i<n;i++)
{
init(c);
c=suma(a,b);
a=b;
b=c;
}
//Se afiseaza al n-lea termen al Sirului lui Fibonacci, reprezentand chiar raspunsul problemei
afis(c);
return 0;
}