#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define FAIL(msg) \
do \
{ \
perror(msg); \
goto cleanup; \
} while (0)
static const char* choose(const char* left, const char* right)
{
const size_t len_left = strlen(left);
const size_t len_right = strlen(right);
if (len_left > len_right)
return left;
if (len_right > len_left)
return right;
if (strcmp(left, right) < 0)
return right;
return left;
}
static const char* get_max(const char* n1, const char* n2, const char* n3)
{
return
choose(
n1,
choose(n2, n3));
}
int main()
{
FILE* in = NULL;
FILE* out = NULL;
char* n1 = NULL;
char* n2 = NULL;
char* n3 = NULL;
const char* max_num = NULL;
in = fopen("input.txt", "r");
if (!in)
FAIL("Cannot open file 'input.txt'");
if (3 != fscanf(in, "%m[0-9] %m[0-9] %m[0-9]", &n1, &n2, &n3))
FAIL("Wrong input format");
max_num = get_max(n1, n2, n3);
out = fopen("output.txt", "w");
if (!out)
FAIL("Cannot open file 'output.txt'");
if (fprintf(out, "%s\n", max_num) < 0)
FAIL("Output to 'output.txt' fail");
fclose(in);
fclose(out);
free(n1);
free(n2);
free(n3);
return 0;
cleanup:
if (in)
fclose(in);
if (out)
fclose(out);
if (n1)
free(n1);
if (n2)
free(n2);
if (n3)
free(n3);
return 1;
}
Каждая (которая для md5). Это как раз базис сжатия радужных таблиц.
Если известный пароль попал в радужную таблицу, то там есть и md5(…много раз… md5()…)))