Cod sursa(job #2088913)

Utilizator arcoC. Nicolae arco Data 16 decembrie 2017 01:53:05
Problema Factorial Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <stdint.h>

typedef unsigned int uint;

uint n_zeros(uint n);

int main(void)
{
	FILE *in =  fopen("fact.in", "r");
	FILE *out = fopen("fact.out", "w");

	if(in != NULL && out != NULL)
	{
		uint n;
		fscanf(in, "%u%*c", &n);
		if(n == 0)
		{
			fprintf(out, "1\n");
			return 0;
		}

		uint64_t p = 0, q = 100000000000, min = 0;
		bool found = false;
		while(p <= q)
		{
			uint64_t mid = (p + q) / 2;
			uint z = n_zeros(mid);
			if(z == n)
			{
				// printf("here: %u %u %u %u\n", z, n, mid, n_zeros(mid));
				found = true;
				min = mid;
				q--;
			}
			else if(n > z)
			{
				p = mid + 1;
			}
			else if(n < z)
			{
				q = mid - 1;
			}
		}
		if(!found)
		{
			fprintf(out, "-1\n");
		}
		else
		{
			fprintf(out, "%llu\n", min);
		}

		fclose(in);
		fclose(out);
	}
	else
	{
		printf("file error\n");
	}

	return 0;
}

uint n_zeros(uint n)
{
	uint zeros = 0, idx = 1;
	while(1)
	{
		uint d = n / (uint)pow(5, idx++);
		zeros += d;
		if(!d)
		{
			break;
		}
	}

	return zeros;
}