Jeg prøver at løse dette problem:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=36Hvor en given talrækkes, tal, har en cycle length. Denne cycle length er angivet på hvor mange gange det tal kan tranformeres før det bliver 1. Hvis tallet er
lige divideres det med 2, hvis tallet er
ulige ganges det med 3 samt plusses med 1.
Og er kommet frem til denne bruteforce løsning i ANSI C:
/*
100 - 3n+1 problem
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char **argv) {
unsigned int argIdx;
/* For each pair of input */
for (argIdx = 1; argIdx < argc; argIdx+=2) { /* Ignore file name arg of this */
unsigned int loopIdx, min, max;
unsigned int maxCycles = 0; /* Max number of cycles found */
unsigned int i = atoi(argv[argIdx]);
unsigned int j = atoi(argv[argIdx+1]);
if (i <= j) {
min = i;
max = j;
} else {
min = j;
max = i;
}
/* Bruteforce cycle length for each input number in range */
for (loopIdx = min; loopIdx <= max; loopIdx++) {
unsigned int number = loopIdx;
unsigned int cycles = 0;
/* Keep counting cycles */
while (true) { /* Break out if 1 */
cycles++;
if (number == 1) break;
if (number % 2 == 0) {
number = number / 2;
} else {
number = number * 3 + 1;
}
}
if (cycles > maxCycles)
maxCycles = cycles;
}
printf("%u %u %u\n", i, j, maxCycles);
}
return 0;
}
Jeg har testet inputs med det på problemstillingen og får samme output. Har også fundet en hjemmeside der kunne give output ud fra noget input man skrev på og der giver mit program også samme svar.
Kan nogen se fejl i koden eller min fremgangsmåde (udover brute force)?
Indlæg senest redigeret d. 22.09.2010 20:58 af Bruger #14645