Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 43. Virtual rätsel

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
23.10.2003, 09:38 Uhr
Nachtwolf



hmm rein von der logik her reichts ned nur bis zur wurzel, (siehe dein eigenes bsp in zahlen: s(14)= 1+2+7+14 = 24 <- 7 ist größer als die Wurzel => sprich man muss auf alle fälle bis zur hälfte.

just my 2 cents (bin jetzt zfaul an code zu schreiben )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
23.10.2003, 11:30 Uhr
virtual
Sexiest Bit alive
(Operator)


@Nachtwolf:
Ja, aber 7 ist nur deshalb Teiler von 14, weil es auch die 2 ist. Also brauche ich nur die Zahlen bis zur wurzel und kann dann - wie auch im Post 009 geschehen - direkt den korrespondierenden Teiler, der größer als die Wurzel ist - gleich zur Summe addieren:
Wenn i teiler von x, dann ist auch x/i teiler von x, also addiere i und x/i zur summe.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
23.10.2003, 19:53 Uhr
Nachtwolf



hmm hast a wieder recht.. i sollt ned versuchen zu denken während ich in der schule bin ich post nur no von zaus aus da kommt mehr raus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
24.10.2003, 18:02 Uhr
NemoEimi



Hallo,

hier mal meine Lösung für dieses Rätsel, natürlich in Java :


C++:

//Dieses Programm findet alle Zahlenpaare der Form (n, n+1) zwischen eins und einer frei wählbaren Zahl < 2^31, für die n und n+1 die gleiche Teilersumme haben
//Dabei ist die obere Grenze des Suchbereiches als Kommandozeilenparameter zu übergeben
public class tsum {
  public static int prim_teiler(int n) {
    if (n%2==0) return(2);
    for (int i = 3; i * i <= n; i = i + 2)
      if (n%i==0) return(i);
    return(n);
    }
  public static int teilersumme(int n) {
    int summe = 1;
    //wir haben uns überlegt, daß für teilerfremde Zahlen m und n
    //teilersumme(m*n) = teilersumme(m)*teilersumme(n) ist
    while (n > 1) {
      int p = prim_teiler(n);
      int neuer_faktor = 1; int pow = 1;
      while (n%p == 0) {
        pow = pow * p;
    neuer_faktor = neuer_faktor + pow;
    n = n / p;
    }
      summe = summe * neuer_faktor;
      }
    return(summe);
    }
  public static void main(String[] args) {
    int n = Integer.parseInt(args[0]);
    int letzte_summe = 1;
    for (int i = 2; i < n; i++) {
      int aktuelle_summe = teilersumme(i);
      if (letzte_summe == aktuelle_summe) System.out.println((i - 1) + " " + i + " " + letzte_summe);
      letzte_summe = aktuelle_summe;
      }
    }
  }




Grüße,
Nemo

P.S.: Wenn ich diesen Java-Code eins-zu-eins nach C++ übertrage, und dann mit gcc zweistufig compiliere (also den Compiler Profilerinformation auswerten lasse), dann kriege ich drei Prozent Geschwindigkeitsvorsprung für die C++ - Version hin. Falls jemand noch nette Mikrooptimierungen sieht, die da einen größeren Unterschied erzeugen (bin im Finden solcher Optimierungen nicht gut), wäre ich interessiert.

Dieser Post wurde am 24.10.2003 um 18:22 Uhr von NemoEimi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
24.10.2003, 18:16 Uhr
(un)wissender
Niveauwart


Naja, zumindest steht C++ drüber
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: