Cod sursa(job #2117636)

Utilizator arcoC. Nicolae arco Data 29 ianuarie 2018 00:41:42
Problema Sum Scor 45
Compilator c Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

typedef unsigned int uint;

uint *ciur(uint n, uint *size);
uint get_sum(uint x, uint *cr, uint size);

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

	if(in != NULL && out != NULL)
	{
		uint size;
		uint *cr = ciur(1000000, &size);
		uint n, i = 0;
		fscanf(in, "%u%*c", &n);
		for(; i < n; i++)
		{
			uint t;
			fscanf(in, "%u%*c", &t);
			fprintf(out, "%u\n", get_sum(t, cr, size));
		}

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

	return 0;
}

uint get_sum(uint x, uint *cr, uint size)
{
	uint *data = malloc(sizeof(uint) * (2 * x + 2));
	if(data != NULL)
	{
		uint i = 1;
		for(; i <= 2 * x; i++)
		{
			data[i] = i;
		}

		i = 0;
		uint s = x;
		for(; i < size && x > 1; i++)
		{
			uint p = 0;
			while(x % cr[i] == 0)
			{
				p++;
				x /= cr[i];
			}
			if(p)
			{
				uint j = cr[i];
				for(; j < 2 * s; j += cr[i])
				{
					data[j] = 0;
				}
			}
		}
		i = 1;
		uint sum = 0;
		for(; i < 2 * s; i++)
		{
			sum += data[i];
		}
		free(data);
		return sum;
	}
	else
	{
		printf("failed\n");
	}
}

uint *ciur(uint n, uint *size)
{
	uint psize = 5, pidx = 0, pgrow = 5;
	uint *primes = malloc(sizeof(uint) * psize);
	uint *vector = malloc(sizeof(uint) * (n + 1));
	if(vector != NULL && primes != NULL)
	{
		uint i = 1;
		for(; i <= n; i++)
		{
			vector[i] = i;
		}
		primes[pidx++] = 2;
		i = 2;
		for(; i <= n; i += 2)
		{
			vector[i] = 0;
		}
		uint last = 2;
		while(1)
		{
			bool found = false;
			i = last;
			for(; i <= n; i++)
			{
				if(vector[i])
				{
					if((pidx + 1) >= psize)
					{
						psize += pgrow;
						primes = realloc(primes, sizeof(uint) * psize);
						if(primes == NULL)
						{
							printf("Can't realloc\n");
						}
					}
					primes[pidx++] = i;
					found = true;
					last = i;
					break;
				}
			}

			if(!found)
			{
				break;
			}
			uint mark = i, inc = i;
			for(; mark <= n; mark += inc)
			{
				vector[mark] = 0;
			}
		}

		free(vector);
		*size = pidx;
		return primes;
	}
	else
	{
		printf("Error\n");
	}
}