Pagini recente » Cod sursa (job #1734369) | Cod sursa (job #2517521) | Cod sursa (job #2944794) | Cod sursa (job #1394310) | Cod sursa (job #1416065)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct header_data {
int n;
int s;
} header_data;
typedef struct two_sum {
int v[2];
int sum;
} two_sum;
header_data readHeader (FILE* in) {
header_data h;
fscanf(in, "%d %d", &(h.n), &(h.s));
return h;
}
void readNumbers (int* v, int n, FILE* in) {
int i;
for (i = 0; i < n; i++) {
fscanf(in, "%d ", &v[i]);
}
}
void setTwoSums (int* v, int n, two_sum* twoSumsVect) {
int i, j, m = 0;
two_sum t;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
t.v[0] = v[i];
t.v[1] = v[j];
t.sum = v[i] + v[j];
twoSumsVect[m++] = t;
}
}
}
int setTheSixNumbers (two_sum* twoSumsVect, int n, int desiredSum, int* result) {
int n2 = n * n;
int i = 0, j = n2 - 1, k;
for (k = 0; k < n2; k++) {
two_sum current = twoSumsVect[k];
while (i < j) {
two_sum left = twoSumsVect[i];
two_sum right = twoSumsVect[j];
if (left.sum + right.sum + current.sum == desiredSum) {
result[0] = left.v[0];
result[1] = left.v[1];
result[2] = right.v[0];
result[3] = right.v[1];
result[4] = current.v[0];
result[5] = current.v[1];
return 1;
}
if (left.sum + right.sum + current.sum < desiredSum) {
i++;
}
else {
j--;
}
}
}
return 0;
}
void printResult (int* result, int exists, FILE* out) {
if (exists) {
int i;
for (i = 0; i < 6; i++) {
fprintf(out, "%d ", result[i]);
}
}
else {
fprintf(out, "%d", -1);
}
}
int cmpfunc (const void * a, const void * b) {
return ( (*(two_sum*)a).sum - (*(two_sum*)b).sum );
}
int cmpint (const void *a, const void *b) {
return ( *(int*)a - *(int*)b );
}
int main () {
FILE *out = fopen ("loto.out","w");
FILE *in = fopen ("loto.in","r");
header_data h = readHeader(in);
int n = h.n;
int s = h.s;
int v[n];
readNumbers(v, n, in);
two_sum* twoSumVect = (two_sum*) malloc(n * n * sizeof(two_sum));
setTwoSums(v, n, twoSumVect);
qsort(twoSumVect, n * n, sizeof(two_sum), cmpfunc);
int result[6];
int exists = setTheSixNumbers(twoSumVect, n, s, result);
printResult(result, exists, out);
free(twoSumVect);
return 0;
}