Brauche Delphiprogramm

Status
Für weitere Antworten geschlossen.

Evilface Vegeta

Evil is my destiny
Ich weiß, dass das jetzt nicht so ganz richtig herhingehört aber ich bin am verzwiefeln, weil ich folgendes Programm schreiben soll:

befreundete Zahlen zwischen m bis n
Eingabe: zwei Zahlen vom Datentyp integer
Ausgabe: die befreundeten Zahlen innerhalb dieses Bereichs

Zwei Zahlen sind befreundet, wenn die eine mit der Summe der echten Teiler der anderen übereinstimmt und umgekehrt.
Befreundet sind z.B. die beiden Zahlen 48 und 75, denn es gilt:
75=2+3+4+6+8+12+16+24 (Summe der echten Teiler von 48) und
48=3+5+15+25 (Summe der echten Teiler von 75)

Bitte antwortet schnell denn ich brauche das Programm äußerst dringend für ein seeeeeeeeeeeehr wichtiges Referat und postet keine scheiße. Nur Programme die funktionieren wenn´s geht im Delphi 4 oder 5.
 
Ich kann zwar Delphi,

versteh aber 1. deine Frage nicht und 2. hab ich Delphi 6! Könntest du das bitte etwas genauer für einen 7tklässler erklären? =)
 
ok du meinst wie bei deinem Beispiel wären das? äh ...
75=5*5*3
48=2*2*2*2*3

also ist 3 die einzige befreundete Zahl oder was?

Erkläre bitte wann eine Zahl als befreundet gilt dann schreib ich dir die einzelschritte auf
 
wie das geht würd mich au ma interessieren, aber für c++...... das zusammenrechnen is ja kein prob aber die teiler ausrechnen... hmmm.....


EDIT

Ich kann es zwar nicht mit Delphi, aber in C++ hab ich es geschafft:

int main()
{
cout<<"Geben sie die Zahl ein: "<< endl;
cin>>a;
cout<<"Die moeglichen Teiler sind: "<< endl;
for (i=1; i<1000000; i++)
{
var1 = a%i;
if (var1==0)
{
cout<<i<< endl;
}
}
}


So... er zeigt alle möglichen Teiler an, indem er mit 1000000 zahlen probiert, ob ein rest rauskommt... Wenn es keinen rest gibt, zeigt er i an.... das zusammenrechnen der ganzen i's kann jeder für sich machen, das stellt kein großes problem mehr dar.
 
Zuletzt bearbeitet:
Original geschrieben von Daedalus
wie das geht würd mich au ma interessieren, aber für c++...... das zusammenrechnen is ja kein prob aber die teiler ausrechnen... hmmm.....


EDIT

Ich kann es zwar nicht mit Delphi, aber in C++ hab ich es geschafft:

int main()
{
cout<<"Geben sie die Zahl ein: "<< endl;
cin>>a;
cout<<"Die moeglichen Teiler sind: "<< endl;
for (i=1; i<1000000; i++)
{
var1 = a%i;
if (var1==0)
{
cout<<i<< endl;
}
}
}


So... er zeigt alle möglichen Teiler an, indem er mit 1000000 zahlen probiert, ob ein rest rauskommt... Wenn es keinen rest gibt, zeigt er i an.... das zusammenrechnen der ganzen i's kann jeder für sich machen, das stellt kein großes problem mehr dar.

ints gehn aber nich so hoch
unsigned ints auch nich
unsigned long ints auch nich
gibt immer überlauf
ausser du machstn eigenen datentyp
oder per feld
:p
 
Meinst du jetzt überlauf beim zusammenrechnen oder bei dem programm das ich da hingeschrieben hab? da funktioniert es nämlich :)
 
Original geschrieben von Daedalus
Meinst du jetzt überlauf beim zusammenrechnen oder bei dem programm das ich da hingeschrieben hab? da funktioniert es nämlich :)

dein programmierstil is grässlich :>
cin / cout sin auch eklig, wenn schon konsolenausgabe dann bitte printf weil man damit VIEL mehr machn kann :>

Code:
#include <stdio.h>

int main()
{
 int a, i, teiler;

 printf("Zahl: ");
 scanf("%d", &a);
 printf("\nDie moeglichen Teiler sind: ");

 for (i=1; i <= a; i++) {
  teiler = a%i;
  if (teiler == 0) printf("%d\n", i);
 }
}

sauberer & besser
wenn man bei dir ne grössere zahl angibt als die schleife läuft gibts datenverlust weil die letzten teiler nich angezeigt werden können
 
Was ich bei printf() und scanf() nie verstanden hab, wozu dieses ganze %d, "\n" usw? z.b.

printf("%d\n",i);

%d\n?????

scanf("%d",&a);

%d, &a??????

printf("\nDie moeglichen Teiler sind: ");

\n?????
 
ok das hab ich jetzt ja verstanden ... aber was ist die aufgabe???
Zahlen von 1bisX auflisten die befreundet sind oder zwei zahlen überprüfen ob die befreundet sind?
 
Original geschrieben von Daedalus
Was ich bei printf() und scanf() nie verstanden hab, wozu dieses ganze %d, "\n" usw? z.b.

printf("%d\n",i);

%d\n?????

scanf("%d",&a);

%d, &a??????

printf("\nDie moeglichen Teiler sind: ");

\n?????
Jetzt kann ich wieder mitreden. :) Kann zwar kaum C++, sowas lernt man aber schon bei C4Script.

\n ist eine escapeter Zeilenumbruch. Die %-Dinger binden Variablen ein, die nach dem String als weitere Parameter folgen, bei deinem ersten Beispiel würde also der Wert von i und dann ein Zeilenumbruch geschrieben werden. Die, die ich kenne sind %d (Dezimalzahl) %x (Hexadezimalzahl) %c (Char - ein Zeichen) und %s (String). In C4Script gibt's auch noch %i (Objekt-ID), das gibt's bei C++ aber wahrscheinlich nicht. In deiner Schleife würde "for (i=1; i<a; i++)" übrigens reichen, dann sollte es auch keine Typenprobs geben.
 
Zuletzt bearbeitet:
Original geschrieben von xJulian
Jetzt kann ich wieder mitreden. :) Kann zwar kaum C++, sowas lernt man aber schon bei C4Script.

\n ist eine escapeter Zeilenumbruch. Die %-Dinger binden Variablen ein, die nach dem String als weitere Parameter folgen, bei deinem ersten Beispiel würde also der Wert von i und dann ein Zeilenumbruch geschrieben werden. Die, die ich kenne sind %d (Dezimalzahl) %x (Hexadezimalzahl) %c (Char - ein Zeichen) und %s (String). In C4Script gibt's auch noch %i (Objekt-ID), das gibt's bei C++ aber wahrscheinlich nicht. In deiner Schleife würde "for (i=1; i<a; i++)" übrigens reichen, dann sollte es auch keine Typenprobs geben.

falsch :>
das mit dem einbinden is richtig, aber die sachen sin falsch :>
%d bzw. %i stehn einfach für int, nich dezimal oder so
%f float
%lf double
%c char (1 zeichen)
%s string

ich sagte ja daedalus, printf() is viel flexibler bzw. damit kann man viel mehr machn als mim shice cout :>
soviel zu printf(), bei scanf():
scanf("datentyp", addresse einer variable);
datentyp (s. printf)
addresse einer variable, logisch oder? :>
z.b. würde gehn: scanf("%d", &zahl);
oder scanf("%c", &zeichen);
oder scanf("%s", string); //hier kein & davor, sollte dir klar sein wenn du weisst wie felder aufgebaut sin :>
oder scanf("%lf", &double_zahl);
usw.
 
Original geschrieben von xJulian
Jetzt kann ich wieder mitreden. :) Kann zwar kaum C++, sowas lernt man aber schon bei C4Script.

\n ist eine escapeter Zeilenumbruch. Die %-Dinger binden Variablen ein, die nach dem String als weitere Parameter folgen, bei deinem ersten Beispiel würde also der Wert von i und dann ein Zeilenumbruch geschrieben werden. Die, die ich kenne sind %d (Dezimalzahl) %x (Hexadezimalzahl) %c (Char - ein Zeichen) und %s (String). In C4Script gibt's auch noch %i (Objekt-ID), das gibt's bei C++ aber wahrscheinlich nicht. In deiner Schleife würde "for (i=1; i<a; i++)" übrigens reichen, dann sollte es auch keine Typenprobs geben.

nich ganz richtig :>
das mit dem einbinden is richtig, aber die sachen was sie zu bedeuten haben sin falsch :>
%d bzw. %i stehn einfach für int, nich dezimal oder so
%f float
%lf double
%c char (1 zeichen)
%s string

ich sagte ja daedalus, printf() is viel flexibler bzw. damit kann man viel mehr machn als mim shice cout :>
soviel zu printf(), bei scanf():
scanf("datentyp", addresse einer variable);
datentyp (s. printf)
addresse einer variable, logisch oder? :>
z.b. würde gehn: scanf("%d", &zahl);
oder scanf("%c", &zeichen);
oder scanf("%s", string); //hier kein & davor, sollte dir klar sein wenn du weisst wie felder aufgebaut sin :>
oder scanf("%lf", &double_zahl);
usw.
 
Original geschrieben von xJulian
Jetzt kann ich wieder mitreden. :) Kann zwar kaum C++, sowas lernt man aber schon bei C4Script.

\n ist eine escapeter Zeilenumbruch. Die %-Dinger binden Variablen ein, die nach dem String als weitere Parameter folgen, bei deinem ersten Beispiel würde also der Wert von i und dann ein Zeilenumbruch geschrieben werden. Die, die ich kenne sind %d (Dezimalzahl) %x (Hexadezimalzahl) %c (Char - ein Zeichen) und %s (String). In C4Script gibt's auch noch %i (Objekt-ID), das gibt's bei C++ aber wahrscheinlich nicht. In deiner Schleife würde "for (i=1; i<a; i++)" übrigens reichen, dann sollte es auch keine Typenprobs geben.

nich ganz richtig :>
das mit dem einbinden is richtig, aber die sachen was sie zu bedeuten haben is falsch :>
%d bzw. %i stehn einfach für int, nich dezimal oder so
%f float
%lf double
%c char (1 zeichen)
%s string

ich sagte ja daedalus, printf() is viel flexibler bzw. damit kann man viel mehr machn als mim shice cout :>
soviel zu printf(), bei scanf():
scanf("datentyp", addresse einer variable);
datentyp (s. printf)
addresse einer variable, logisch oder? :>
z.b. würde gehn: scanf("%d", &zahl);
oder scanf("%c", &zeichen);
oder scanf("%s", string); //hier kein & davor, sollte dir klar sein wenn du weisst wie felder aufgebaut sin :>
oder scanf("%lf", &double_zahl);
usw.
 
Ermahnung an spidey!

Ich hab jetzt extra n paar Stunden gewartet, um die die Chance zu geben, jedenfalls einen von den drei Posts zu löschen, aber da dem jetzt nicht so ist, muss ich dich ermahnen.
 
Keine Ahnung, aber wenn ich im Netz dazu nichts finde, wuerde ich bei solchen "mathematischen" Problemstellungen mal den Knuth befragen (Donald Knuth, The Art Of Computer Programming). Sollte in Fachbibliotheken zu bekommen sein, wenn man (durchaus verstaendlich) nicht direkt die weit ueber 100 Euro selbst fuer die billige Paketausgabe auf den Tisch legen will.

@Jiita: Es waere uebrigens super, wenn du dann fuer uns Nachleser auch zwei der drei Posts loeschst ;)

[von jiita] *nich spammen will und deshalb so editier* ^^"""
ich habs versucht, sie zu löschen, ging net ... warum auch immer ... sonst hätt ichs gemacht ^^" *ins bett flücht*
[/von jiita]
 
Zuletzt bearbeitet von einem Moderator:
Original geschrieben von spidey
nich ganz richtig :>
das mit dem einbinden is richtig, aber die sachen was sie zu bedeuten haben is falsch :>
%d bzw. %i stehn einfach für int, nich dezimal oder so
%f float
%lf double
%c char (1 zeichen)
%s string
Ich sagte ja, die Erklärung stammt aus C4Script und kann unter C++ geringfügig anders sein. Floats gibt's da gar nicht und der Rest stimmt ja auch soweit.
 
Danke ihr 2, muss gleich ma auswendig lernen :)

achja spidey, tripplepost, oha selten gesehn :)


EDIT

OHA ich habs geschafft mit meinem rechenprogramm einen ausahmefehler zu verursachen :lol2: :rofl: :rofl: :lol2:

scanf("%s\n", var1);
printf("\n", var1);


:lol2: :lol2:
 
Zuletzt bearbeitet:
interessante aufgabe! ich habe eben schnell mal die aufgabe in delphi 6.0 komplett gelöst (sollte auch in delphi 4&5 laufen!):

------------------------------------------------

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

Var
m, n, m1: Integer;

Function Teiler(zahl: Integer): Integer;
Var
i,j: Integer;
Begin
j:=0;
FOR i:=2 TO zahl-1 DO IF (zahl MOD i)=0 THEN j:=j+i;
Teiler:=j;
End;

begin
Write('von m: '); Readln(m);
Write('bis n: '); Readln(n);
Writeln;
IF m<3 THEN m:=3; IF n<3 THEN n:=3;
REPEAT
m1:=Teiler(m);
IF (m=Teiler(m1)) AND (m<m1) THEN Writeln(m,' und ',m1);
inc(m);
UNTIL m>=n;
Writeln; Writeln('Fertig');
Readln;
end.


------------------------------------------

hier das programm + sourcecode nochmal:


habe mal die zahlen im bereich von 1 bis 100000 getestet, folgende befreundete Zahlen hat er gefunden:

48 und 75
140 und 195
1050 und 1925
1575 und 1648
2024 und 2295
5775 und 6128
8892 und 16587
9504 und 20735
62744 und 75495

mein rechner hat dafür etwa 6 min gebraucht ;O)

mfg
 
Zuletzt bearbeitet:
interessant, wie schnell es doch geht... bei der zahl 999 999 999 hat mein comp mal eben von 2 bis 999 999 998 rechnungen gemacht, innerhalb von etwa 6 sekunden, maximal.. is schon krass
 
@Evilface Vegeta:

Ich glaube du hast in deiner Aufgabenstellung einen fehler drinn!
Bei dem beispiel fehlt nämlich der teiler 1, demnach sind die beiden zahlen 48 & 75 nicht befreundet (siehe auch den link den du gepostet hast). Ich habe zwar jetzt noch diesen fehler in meinem programm, aber man braucht nur in der function Teiler den anfangswert bei der schleife auf i:=1 setzten.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten