Cod sursa(job #205832)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 3 septembrie 2008 01:16:41
Problema Numere 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<stdio.h>
#include <string.h>

int n[200], a[200], b, x, aux[200], unu[200], d[200];


int compar(int a[], int da, int b[], int db)
{
	int i;
	if (da > db) return 1;
	if (da < db) return -1;
	if (da == db)
	{
		for (i = da; i >= 1; i--)
			if (a[i] != b[i])
			{
				if (a[i] > b[i]) return 1;
				else return -1;
			}
	}
	return 0;
}
	

void inmultire(int A[], int B[])
{
	int i, j, t;	
	int C[200];

	for (i = 1; i <= A[0]; i++)
	{
		for (j = 1, t = 0; j <= B[0] || t; j++, t /= 10)
			C[j + i - 1] = (t += C[i + j - 1] + A[i] * B[j]) % 10;
		if (i + j - 2 > C[0] ) C[0] = i + j - 2;
	}
        for (i = 1; i <= C[0]; i++) A[i] = C[i], C[i] = 0;
		A[0] = C[0]; C[0] = 0;

}

void adunare(int A[], int B[])
{
	int i, t = 0;
	for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= 10)
		A[i] = (t += A[i] + B[i]) % 10;
	A[0] = i - 1;
}

void copy(int A[], int B[])
{
	for (int i = 0; i <= B[0]; i++) A[i] = B[i];
}

void afis()
{
	int i;
	for (i = a[0]; i >= 1; i--) printf("%d",a[i]);
}

int main()
{
	freopen("numere2.in","r",stdin);
	freopen("numere2.out","w",stdout);

	char s[200];
	int len;
	scanf ("%s",s);
	len = strlen(s);
	n[0] = len;
	for (int i = 1; i <= len; i++) n[i] = s[len - i] - '0';
	d[0] = 1; d[1] = 2;
	unu[0] = unu[1] = 1;	
	
	for (; compar(d,d[0],n,n[0]);)
    {
		copy(a,d);
		copy(aux,d);
		b = 1;

		while (compar(a,a[0],n,n[0]) == -1)
		{
			b++;
			inmultire(a,aux);
		}

		if (compar(a,a[0],n,n[0]) == 0)
		{
			afis();
			printf("\n%d\n",b);
			return 0;
		}
		adunare(d,unu);
    }
	
	return 0;
}