C
Da mir das irgendwie Spass gemacht hat hier noch ein kleiner Nachschlag:
int perm_next(int *s, size_t n)
{
for (int i = n - 1; i >= 0; --i)
{
if (s[i] == -1)
{
s[i] = 1;
return 1;
}
s[i] = -1;
}
return 0;
}
// "Inlined ;)"
//int get_ener(int *s, int n)
//{
// int C, E = 0;
// for (int k = 1; k < n; ++k)
// {
// C = 0;
// for (int j = 0; j < n - k; ++j)
// C += s[j] * s[j + k];
// E += C * C;
// }
// return E;
//}
size_t get_min_ener(size_t n)
{
int s[0x100];
if (n >= sizeof(s) / sizeof(*s))
return 0;
size_t j, k, min = -1;
for (j = 0; j < n; ++j)
s[j] = -1;
do {
size_t C, E = 0;
for (k = 1; k < n; ++k)
{
C = 0;
for (j = 0; j < n - k; ++j)
C += s[j] * s[j + k];
E += C * C;
} // get_ener()
if (E < min)
min = E;
} while (perm_next(s, n));
return min;
}
void print_ener(size_t min, size_t max)
{
while (min <= max)
{
time_t t = clock();
printf("n: %d; min: %d; t: %d;\n", min,
get_min_ener(min), clock() - t);
++min;
}
}
int main()
{
print_ener(4, 28);
getchar();
}
Scheinen zumindest die von der Aufgabenstellung geforderten Werte zu kommen. Welche Note bekomme ich?
(Dauert übrigens ewig das Permutieren.. hat jemand vielleicht eine schnellere Lösung?)
Edit:
Zeitmessung eingefügt.