[link] Project Euler - Programmieraufgaben

WOOHOO ICH HABS GESCHAFFT :D

Sorry, das musste sein ...

Durch Elderans Vorarbeit war es mir möglich eine Struktur zu erkennen und eine Zahlenfolge aufzustellen: Bn = 16 * Kn wobei Kn = Ln-1 + Kn-2

Und hier mein Programm in Delphi:

Code:
program euler_138;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var i:integer; b,L1,L2,sum,temp:Extended;
    Bn : array[0..11] of Extended;
    Kn : array[0..11] of Extended;
    Ln : array[0..11] of Extended;
    summe:string;
begin
  Bn[0]:=16;
  Kn[0]:=1;
  Ln[0]:=17;

  Bn[1]:=272;
  Kn[1]:=17;
  Ln[1]:=305;

  for i:=2 to 11 do
   begin
   Kn[i]:=(Ln[i-1]+Kn[i-2]);
   Bn[i]:=16*Kn[i];

   temp := sqrt(5*sqr(Bn[i])+8*Bn[i]+4)/2;
   if Frac(temp)=0 then Ln[i] := temp
   else Ln[i] := sqrt(5*sqr(Bn[i])-8*Bn[i]+4)/2;

   writeln(Ln[i]);
   end;
   
  sum:=0;

  for i:=0 to 11 do sum:=sum+Ln[i];
  summe := FloatToStrF(sum, ffGeneral, 50, 50);
  writeln(summe);
  readln;
end.
 
kann leider grad nicht viel am Projekt arbeiten, weil ich grad meine paar Klausuren schreib... :( mal schaun, morgen in einer woche werd ich mich wieder aktiv dransetzen können :)
 
OK, hab mich ma spaßeshalber an Problem 140 gemacht und hab jetz folgendes raus:
gibts hier auch nen TeX-Plugin?
A_G(x) = A_F(x) * (1+3*x)
wobei A_F(x) die bereits behandelte Reihe ist :)
Man müsste insofern eigentlich nur sein momentanes Programm bissel umändern und schon is das Problem gelöst, denk ich mir...

wers wissen will, die Umkehrfunktion, in die man ganze Werte reinstopft und auf die Wurzel aufpassen muss, sähe folgendermaßen aus:

y=( -(1+x)+ sqrt(5*x^2+14*x+1) )/( 3+x )

gibt ja eigentlich zwei Lösungen, aber da die zweite negativ und somit sinnlos is, lass ich die mal weg.

Ich hab mir das bis jetzt immer so vorgestellt, dass ich da eben ganzzahlige Werte für x einsetze und dabei besonders in die Wurzel, weil wenn unter der Wurzel eine QUadratzahl rauskommt, kann ich sicher sein, dass die Zahl, die effektiv rauskommt, eine rationale Zahl ist und somit ein golden nugget.

Mein Problem hierbei ist nur immer, dass die Zahlen da so unverschämt groß werden, dass mein Java nicht mehr mitmacht :(

Hab ich irgendwas übersehen, wo Ihr mir evtl. helfen könnt?

Is halt allerdings noch nicht wirklich fertig ^^ ich scheiter immer an den großen Zahlen...
 
Hallo!

Danke für den Link, die Aufgaben sind wirklich klasse! Außerdem habe ich endlich einen Anlass, meine lange Zeit brachliegende BigInteger-Unit für Delphi weiterzuschreiben.

Leider bin ich zu blöd für Problem 147. Hat dafür vielleicht jemand einen Ansatz?
 
Ich will jetzt mal ganz ehrlich sein: Ich hab nicht viel Ahnung von Mathe.

Schon das erste Problem stellt mich vor große Probleme. Ich habe jetzt nach etwa einer Stunde Nachdenken und Verbesserungen keine Idee mehr, wie ich noch an die richtige Lösung herankomme. Ich schaffe es einfach nicht. Hier ist mein Ansatz.
Hat irgendwer einen Tipp für mich? Ich denke, ich gehe ganz falsch an die Sache ran.

import std.stdio;

// Die Funktion hier prüft, ob i*3 dasselbe ergibt wie N{5,10,15,20,...}
bool calc(int x) {
for (int l = 0; l < 1000; l += 5) {
if (x*3 == l)
return false;
}
return true;
}

int main() {
int result;

for (int i = 0; i < 1000; i++) {
if (calc(i))
result += i*3;
}
for (int i = 0; i < 1000; i++)
result += i*5;

writefln(result); // ausgeben

return 0;
}

EDIT: Ich würde den Code verstecken, aber ich weiß nicht den BB-Tag dafür, sorry.
EDIT2: Danke, hab's jetzt geändert :)
 
Code:
int result;
Code:
result += i*3;

Wenn ich das richtig sehe addierst du einfach andauernd zu result etwas?
Du könntest das ganze in einen Array packen, oder einfach alles einzeln ausgeben.
Ich würde letzteres vorziehen, da du dann einfach nur anstatt "result += i*3;" zu "writefln(i*3);" umschreiben braeuchtest.

Du kannst den Code mithilfe von [* SPOILER="Ueberschrift" ] verstecken (ohne den *).
 
Du musst doch einfach nur jede Zahl durchlaufen und überprüfen, ob sie durch 3 oder 5 teilbar ist.
Code:
for (int i = 1; i < 1000; i++ ) {
    if(i % 3 == 0 || i % 5 == 0) {
        sum += i;
    }
}
 
Wer noch etwas Hilfe bei P5 braucht:

Code:
    for(int i = 0; ; i++)
        if(i %  1 == 0 && i %  2 == 0 &&
           i %  3 == 0 && i %  4 == 0 &&
           i %  5 == 0 && i %  6 == 0 &&
           i %  7 == 0 && i %  8 == 0 &&
           i %  9 == 0 && i % 10 == 0 &&
           i % 11 == 0 && i % 12 == 0 &&
           i % 13 == 0 && i % 14 == 0 &&
           i % 15 == 0 && i % 16 == 0 &&
           i % 17 == 0 && i % 18 == 0 &&
           i % 19 == 0 && i % 20 == 0)
           cout << i << endl << endl;

@Eyedeet
Vom Ergebnis musste ich schließlich noch 2 abziehen, damit's stimmt oO
x-(5-3)
 
Danke Eydeet, das hat mir sehr geholfen.

Ich hab viel zu kompliziert gedacht. Ich glaube, ich muss noch lange üben, bis ich mathematisch denken kann...

EDIT: Problem 9 hat sofort beim ersten Versuch geklappt. Es gibt also doch noch Hoffnung.
 
Dietox bist du dir sicher? Ich hab das Problem damals mit Delphi auf genau die gleiche Art und Weise gelöst und es hat auf Anhieb geklappt?! Hast du eventuell sum nicht richtig initialisiert?
 
@Cyberm@ster

Ich weiß, es klingt ziemlich komisch, aber wenn ich vom Ergebnis 2 abgezogen hatte, stimmte es oO
Hab übrigens in C/C++ den Code geschrieben aber die Schleife hab ich schon verstanden ;)
Ich weiß nicht, ob es an mir lag, aber wie gesagt, ich musste erst 2 subtrahieren.
 
@ Dietox: Dann will ich dir mal glauben ;) BTW, Problem 5 kann man auch eleganter lösen indem man das kleinste gemeinsame Vielfache der Zahlen 1 - 20 rechnet, bzw. so:

This does not require programming at all. Compute the prime factorization of each number from 1 to 20, and multiply the greatest power of each prime together:

20 = 2^2 * 5
19 = 19
18 = 2 * 3^2
17 = 17
16 = 2^4
15 = 3 * 5
14 = 2 * 7
13 = 13
11 = 11

All others are included in the previous numbers.

ANSWER: 2^4 * 3^2 * 5 * 7 * 11 * 13 * 17 * 19 = 232 792 560

/* Kann vielleicht jemand bei Problem 11 helfen? Ich dachte das würde so klappen, tut es aber wieder nicht: */

Edit: Code verbessert

Code:
program euler_11;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

var raw:TStringList;
    intblock:array of array of integer;
    a,i,j,k,max,n,t1,t2,t3:integer;

begin
 raw := TStringList.create;
 raw.LoadFromFile('text.txt');

 n := raw.Count;
 SetLength(intblock,n,n);

 for j:=0 to n-1 do
  begin
   a:=1;
   for i:=0 to n-1 do
    begin
     intblock[i,j]:=StrToInt(copy(raw[j],a,2)); //copy number pairs to n*n int array
     a:=a+3;
    end;
  end;

 max:=0;

 for j:=0 to n-4 do
  for i:=0 to n-4 do
   begin
    t1:=1;
    t2:=1;
    t3:=1;
    for k:=0 to 3 do
     begin
      t1:=t1*intblock[i+k,j];                   // horizontal
      t2:=t2*intblock[i,j+k];                   // vertical
      t3:=t3*intblock[i+k,j+k];                 // diagonal down
     end;
    if t1 > max then max := t1;
    if t2 > max then max := t2;
    if t3 > max then max := t3;
   end;

 for j:=n-1 downto 3 do
  for i:=0 to n-4 do
   begin
    t1:=1;
    for k:=0 to 3 do
     t1:=t1*intblock[i+k,j-k];                  // diagonal up
    if t1 > max then
     max := t1;
   end;
 
 writeln(max);
 readln;
end.
 
Hi,

Hab mir gestern Abend registert, ist echt genial 8)

Ich hab allerdings ein Problem mit Nr. 4...

Ich komm mit meinem Code auf das Ergebniss 955 x 583 = 580085, was aber anscheinend Falsch ist ;(

Die Funktion IsPalindrome() funktioniert auf jedenfall wunderbar.

Mit folgender Bruteforce Methode wird einfach jedes Produkt darauf überprüft, ob es ein Palindrom ist:

999 x 999
999 x 998
....
999 x 100
998 x 999
...

Ist zwar nicht optimal, müsste aber trotzdem funktionieren [...] X(

Code:
        static void Main(string[] args)
        {

            string Palindrome = "";
            
            for (int Factor1 = 999; Factor1 >= 100; Factor1--)
            {
                for (int Factor2 = 999; Factor2 >= 100; Factor2--)
                {
                    Palindrome = Convert.ToString(Factor1 * Factor2);
                    Console.WriteLine(Factor1 + " x " + Factor2);
                    if(IsPalindrome(Palindrome))
                    {
                        Factor1 = Factor2 = 0;
                    }
                }
            }
            
            Console.Write(Palindrome);
            Console.ReadKey(true);

        }

        static bool IsPalindrome(string String)
        {
            string Fragment1 = String.Substring(0, (String.Length / 2));
            if (String.Length % 2 != 0)
            {
                Fragment1 += String.Substring((String.Length / 2), 1);
            }
            string Fragment2 = ReserveString(String.Substring(String.Length / 2));
            if (Fragment1 == Fragment2)
            {
                return true;
            }
            return false;
        }

        static string ReserveString(string String)
        {
            string NewString = "";
            for(int Index = String.Length; Index >= 1; Index--)
            {
                NewString += String.Substring(Index - 1, 1);
            }
            return NewString;
        }

Edit: Problem gelöst, danke Cyberm@ster!

Gruß Chris
 
Ich steh auf dem Schlauch ... Ich hab mich mal an Problem 22 versucht aber ich bekomm mal wieder ne falsche Lösung. Hat jemand eine Idee wieso? Schon mal Danke im voraus!

Code:
program euler_22;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
 TExplodeArray = array of string;

function Explode(const cSeparator, vString: String): TExplodeArray;
var
  i: Integer;
  S: String;
begin
  S := vString;
  SetLength(Result, 0);
  i := 0;
  while Pos(cSeparator, S) > 0 do begin
    SetLength(Result, Length(Result) +1);
    Result[i] := Copy(S, 1, Pos(cSeparator, S) -1);
    i:=i+1;
    S := Copy(S, Pos(cSeparator, S) + Length(cSeparator), Length(S));
  end;
  SetLength(Result, Length(Result) +1);
  Result[i] := Copy(S, 1, Length(S));
end;

var namescsv : TextFile;
    names, temp : string;
    aname : TExplodeArray;
    i,j:integer;
    tsum,sum:int64;
 
begin
 AssignFile(namescsv, 'names.txt');
 Reset(namescsv);
 while not Eof(namescsv) do
  begin
   ReadLn(namescsv, temp);
   names:=names+temp;
  end;
 CloseFile(namescsv);
 names := StringReplace(names,'"','',[rfReplaceAll,rfIgnoreCase]);
 aname := Explode(',',names);
 sum:=0;
 for i:=0 to length(aname)-1 do
  begin
   tsum:=0;
   for j:=1 to length(aname[i]) do
    tsum:=tsum+Ord(aname[i][j])-64;
   sum:=sum+tsum*(i+1);
  end;
 writeln(sum);
 readln;
end.

@ BlackSun: Ich hab dir ne PN geschickt
 
@ 22:

"begin by sorting it into alphabetical order..."

Ich habs mir leicht gemacht:

if FileExists('names.txt') then
begin
AssignFile(F,'names.txt');
Reset(F);
Read(F,NamesString);
CloseFile(F);
end;
Sum := 0;
NamesList := TStringList.Create;
try
NamesList.CommaText := NamesString;
NamesList.Sort;
for i := 0 to NamesList.Count-1 do
begin
...
end;
finally
NamesList.Free;
end;
 
Ich habe mal ne Verständnissfrage zu Problem 11:
What is the greatest product of four numbers in any direction (up, down, left, right, or diagonally) in the 20x20 grid?
Was versteht man unter den dirctions?
diagonally ist klar.
up/down? vielleicht alle in einer spalte aber da währe down überflüssig
right/left währen dann die Rheinen, aber dann ist auch left überflüssig

Hat das schon einer gelöst und kann mir sagen was gemeint ist?

edit: vielleicht könbnt ihr mir mal ein paar tipps geben wie ich das ganze löse
 
Zurück
Oben