Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 14. Virtual-rästel

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 <
000
17.01.2003, 13:28 Uhr
virtual
Sexiest Bit alive
(Operator)


Schreibe ein Programm, welches alle ganzzahligen Zahlen C zwischen 1 und 1000000 ermittelt, für die sich ganzzahlige A > 1 und B > 1 finden lassen, so daß gilt:

Code:
C*C == A*A + B*B


Erweiterungsvorschläge für Fortgeschrittene:
1. Verwende keine Funktion aus math.h bzw. cmath.
2. Gebe nur die gefunden Werte von C aus, die nicht vielfaches von kleineren gefundenen Cs sind. So sind sowohl 5 alsauch 10 zwar beides Cs, die nach der grundaufgabe gefunden werden könnten; mit der Erweiterung sollte 10 nicht mehr zur Lösungsmenge gehören.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 17.01.2003 um 13:45 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.01.2003, 21:10 Uhr
NemoEimi



Hi,

hier ist mal eine erste Lösung in Java:


C++:
public class triplets {
  public static boolean[] hash;
  public static void findTriplets(int n) {
    for (int i = 1, isquared = i * i; isquared < n; i++, isquared = i*i) {
      for (int j = 1, jsquared = j * j; j < i && isquared + jsquared < n; j++, jsquared = j*j) {
        int c = isquared + jsquared; hash[c] = true;
      }
    }
  }
  public static void main(String[] argv) {
    int n = Integer.parseInt(argv[0]); int zaehler = 0;
    hash = new boolean[n];
    findTriplets(n);
    for (int i = 1; i < n; i++)
      if (hash[ i ]) {System.out.println(i); zaehler++;};
    System.out.println(zaehler + " Werte für c gefunden.");
  }
}



Korrektheitsbeweis kann ich bei Bedarf noch nachliefern, falls jemand Bedenken hat .

Grüße,
NemoEimi

Dieser Post wurde am 17.01.2003 um 21:12 Uhr von NemoEimi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.01.2003, 09:58 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Hier das ganze in C. Hat noch ordentlich Potential für Optimierungen ;-)


C++:
#include <stdio.h>

/******************************************************************************/

char cSieb[1000000]={0};  /* Um Vielfache von bereits gefundenen Zahlen */
                          /* auszublenden */

/******************************************************************************/

float sqrt(float r)
{
   float x0;
  
   /* Im wesentlichen das HERON'sche Verfahren... hab grad keine Lust, das */
   /* weiter zu optimieren */
   x0 = 0.5*((0.5*((0.5*(1+r))+(r/(0.5*(1+r)))))+(r/(0.5*((0.5*(1+r))+(r/(0.5*(1+r)))))));
   x0 = 0.5*((0.5*((0.5*(x0+(r/x0)))+(r/(0.5*(x0+(r/x0))))))+(r/(0.5*((0.5*(x0+(r/x0)))+(r/(0.5*(x0+(r/x0))))))));
   x0 = 0.5*((0.5*((0.5*(x0+(r/x0)))+(r/(0.5*(x0+(r/x0))))))+(r/(0.5*((0.5*(x0+(r/x0)))+(r/(0.5*(x0+(r/x0))))))));
   x0 = 0.5*((0.5*((0.5*(x0+(r/x0)))+(r/(0.5*(x0+(r/x0))))))+(r/(0.5*((0.5*(x0+(r/x0)))+(r/(0.5*(x0+(r/x0))))))));
   x0 = 0.5*((0.5*((0.5*(x0+(r/x0)))+(r/(0.5*(x0+(r/x0))))))+(r/(0.5*((0.5*(x0+(r/x0)))+(r/(0.5*(x0+(r/x0))))))));
   return x0;
}

/******************************************************************************/

int main()
{
   long a, aQuadrat, b, c, cQuadrat, i;
   for(c=1; c<=1000000L; c++)
   {
      if(!cSieb[c])
      {
         cQuadrat = c*c;
         for(a=2; a<c; a++)
         {
            aQuadrat = a*a;
            b = sqrt(cQuadrat - aQuadrat);
            if(b<2) break;
            if(aQuadrat + b*b == cQuadrat)
            {
               printf("%10ld", c);
               for(i=c+c; i<=1000000L; i+=c) cSieb[ i ] = 1;
               break;
            }
         }
      }
   }
   return 0;
}

/******************************************************************************/


--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.01.2003, 12:19 Uhr
NemoEimi




Zitat:
Bruder Leif postete
Moin!

Hier das ganze in C. Hat noch ordentlich Potential für Optimierungen ;-)



Das kann man wohl sagen . Ich habe mal mein Java-Programm so abgeändert, daß es ebenfalls alle c ausfiltert, die Vielfache von anderen sind:


C++:

public class triplets {
  public static boolean[] hash;
  public static void eliminateMultiples(int n) {
    for (int i = 2*n; i < hash.length; i = i + n)
      hash[ i ] = false;
    }
  public static void findTriplets(int n) {
    for (int i = 1, isquared = i * i; isquared < n; i++, isquared = i*i) {
      for (int j = 1, jsquared = j * j; j < i && isquared + jsquared < n; j++, jsquared = j*j) {
        int c = isquared + jsquared; hash[c] = true;
      }
    }
  }
  public static void main(String[] argv) {
    int n = Integer.parseInt(argv[0]); int zaehler = 0;
    hash = new boolean[n];
    findTriplets(n);
    for (int i = 1; i < n; i++)
      if (hash[ i ]) {zaehler++; eliminateMultiples(i);};
    System.out.println(zaehler + " Werte für c gefunden.");
  }
}




und Deines so, daß es die gefundenen c-Werte nur noch zählt.
Mein Programm terminiert dann (statisch compiliert mit gcj -O3 -fomit-frame-pointer) nach 0.22 Sekunden User-time, Deines war nach einer Stunde noch nicht zurückgekommen und länger habe ich nicht gewartet .
Aber abgesehen mal davon, bist Du sicher, daß Dein Programm korrekt ist? Ich würde vermuten, daß aQuadrat und cQuadrat überlaufen ab einem gewissen Punkt.

Grüße,
NemoEimi

Dieser Post wurde am 18.01.2003 um 12:56 Uhr von NemoEimi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.01.2003, 14:13 Uhr
Bruder Leif
dances with systems
(Operator)



Zitat:
NemoEimi postete
Ich würde vermuten, daß aQuadrat und cQuadrat überlaufen ab einem gewissen Punkt.


Oooooooch, ich hatte eigentlich gedacht, daß niemand auf die Idee kommt, das Programm so lange laufen zu lassen
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 18.01.2003 um 14:13 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.01.2003, 13:55 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
#include <stdio.h>

#define MAXIMUM 1000000

int main()
{
    unsigned long squares[MAXIMUM];
    int solutions[MAXIMUM];
    int c, b, a, i, s;

    /*
     * Loop for every C
     */

    s = 0;
    for(c=0; c<MAXIMUM; ++c)
    {
        /*
         * Extend array
         */

        squares[c] = c*c+2*c+1;
        solutions[c] = 0;

        /*
         * Check, if C is a multiply of a solution
         */

        for (i=0; i<s; ++i)
        {
            if (squares[c]%solutions[ i ] == 0) break;
        }
        if (i!=s) continue;      

        /*
         * Find if solution
         */

        for(a=0; squares[c]-2*squares[a]>=0; ++a)
        {
            for(b=0; squares[c]-squares[a]>squares[ b ]; ++b)
            {
            }
            if (squares[c] == squares[a] + squares[ b ])
            {
                solutions[s++] = c+1;
                printf("%d^2 = %d^2 + %d^2\n", c+1, b+1, a+1);
                break;
            }
        }
    }

}



Ist meine Lösung. Anzumerken bleibt, daß ich es auf einem 64 Bittigen System ausgeführt habe. Auf einem 32 Bitter muß man das "unsigned long" durch ein "unsigned long long" ersetzen oder MAXIMUM auf ca 65535 setzen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 20.01.2003 um 13:56 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: