:-D

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 18. Juni 2008, 21:56

EyDu hat geschrieben:
Karl hat geschrieben:So, welche sind die mittleren Ziffern?
Such Dir eben eine der Möglichkeiten aus ;-)
Ja, das war auch genau der Punkt der mir das meiste Kopfzerbrechen bei meiner Lösung gekostet hat, weil ich mich nicht entscheiden konnte und das wohl nicht definiert war. Ich finde das aber recht blöd, weil es damit quasi zwei Arten des Algorithmus gibt, die unterschiedliche Ergebnisse liefern.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Mittwoch 18. Juni 2008, 22:03

Ja, deshalb ist das korrekterweise auch kein Algorithmus.
Jedenfalls ist er zu unpräzise beschrieben.
Ich hab gerade angefangen, das in Brainfuck zu schreiben, aber ich bin noch nicht wirklich weit :p das is ne richtige Qual.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 18. Juni 2008, 22:12

Es scheint so zu sein, dass man bei der Quadratmittenmethoden nach Neumann, um die es hier ja geht, in solchen Fällen, die "Mitte" nach rechts verschiebt.

Beleg - leider ohne weitere Erläuterung, warum gerade dies die Mitte ist:
http://statistik.mathematik.uni-wuerzbu ... seudo.html
BlackJack

Mittwoch 18. Juni 2008, 22:34

Eine Lösung in C, die `libgmp` verwendet. Mittelpunktberechnung ist aber bei meinen Lösungen auf die hypothetischen doppelt so vielen Ziffern der Ausgangszahl bezogen, die beim Quadrieren entstehen können. Alles andere war mir zu kompliziert, weil man sich Sonderfälle einhandelt, wenn der aktuelle Zustand weniger als die hälfte der Ziffern der Ausgangszahl hat.

Code: Alles auswählen

#include <alloca.h>
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>

typedef struct {
    mpz_t state;
    unsigned int length;
} QRandom;

void QRandom_init(QRandom *r, unsigned long n)
{
    mpz_init_set_ui(r->state, n);
    r->length = mpz_sizeinbase(r->state, 10);
}

void QRandom_destroy(QRandom *r)
{
    mpz_clear(r->state);
    r->length = 0;
}

unsigned long QRandom_next(QRandom *r)
{
    char *tmp;
    unsigned int offset;
    
    mpz_mul(r->state, r->state, r->state);
    tmp = alloca(r->length * 2 + 1);
    mpz_get_str(tmp, 10, r->state);
    offset = r->length / 2;
    tmp[offset + r->length] = '\0';
    mpz_set_str(r->state, tmp + offset, 10);
    return mpz_get_ui(r->state);
}

int main(int argc, char** argv) {
    QRandom random;
    unsigned int i;
    
    QRandom_init(&random, 11111);
    for (i = 0; i < 20; ++i) {
        printf("%lu\n", QRandom_next(&random));
    }
    QRandom_destroy(&random);
    
    return EXIT_SUCCESS;
}
Wobei mir gerade auffällt, dass vielleicht auch mal eine 0 oder eine 1 als Zustand auftreten kann, dann sieht's blöd aus mit den folgenden "Zufallszahlen". :-)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 18. Juni 2008, 23:05

Und hier in Vimscript: http://paste.pocoo.org/show/73064/

Muss mal wieder Schmerzen spüren :-)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
dennda
User
Beiträge: 17
Registriert: Montag 19. November 2007, 22:07

Donnerstag 19. Juni 2008, 00:01

Hier noch ein bisschen sehr schlechtes Java.

Wer mich dafür kritisiert wird erschossen. :D
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Donnerstag 19. Juni 2008, 00:18

Rekursiv in Java?
Mutig ;D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 19. Juni 2008, 07:28

audax hat geschrieben:Rekursiv in Java?
Mutig ;D
Wieso?

@dennda:
Du könnest Dir den häßlichen Cast in Zeile 25 sparen:

Code: Alles auswählen

String subsequence = cast.substring(mid-2, mid+2);
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Donnerstag 19. Juni 2008, 08:23

Und weil's so schön ist nochmal in C:

Code: Alles auswählen

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int
nrnd(int n, int x)
{
        int l, nl, offset, i;
        char s[100], s2[100];
        sprintf(s, "%d", n);
        l = strlen(s);

        for (i = 0; i != x; ++i) {
                sprintf(s, "%d", n * n);
                nl = (strlen(s) - l) / 2;
                memcpy(s2, s + nl, l);
                s2[l] = '\0';
                n = atoi(s2);
        }

        return n;
}
TUFKAB – the user formerly known as blackbird
Antworten