Pagini recente » Cod sursa (job #493796) | Cod sursa (job #1187520) | Cod sursa (job #2988916) | Cod sursa (job #1927450) | Cod sursa (job #2117636)
#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");
}
}