Jo, aus 49!ts-soft hat geschrieben:Für 6?cxAlex hat geschrieben:Für was zahl ich immer?
Befreundete Zahlen V 1.00
Ne, in Österreich 6 aus 45 ^^
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
- alter Mann
- Beiträge: 201
- Registriert: 29.08.2008 09:13
- Wohnort: hinterm Mond
falls es jemanden interessiert, es gibt nicht nur befreundete Zahlen
http://www.mathe.tu-freiberg.de/~hebisc ... ahlen.html
http://www.mathe.tu-freiberg.de/~hebisc ... ahlen.html
Win11 64Bit / PB 6.0
> Der Ursprungspost war in nem anderen Forum.
Wir können uns gerne auch dort so toll unterhalten wenn du willst ^^
Wir können uns gerne auch dort so toll unterhalten wenn du willst ^^
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
-
Little John
Nur mal so nebenbei etwas zum Thema ... 
2Andesdaf:
Für einen Beitrag im Abschnitt "Code, Tipps und Tricks" lohnen sich IMHO doch einige Verbesserungen.
Hier einiges, das mir auf den ersten Blick aufgefallen ist:
a) Du benutzt den Befehl OpenConsole nicht richtig. Er gehört nicht in die Schleife, sondern ganz an den Anfang der Ausgabe. Wenn man das Programm so wie es momentan ist startet und für die Grenzen des Zahlenbereichs beispielsweise 100 und 200 eingibt, bekommt man eine Fehlermeldung.
b) Die Prozedur IsTeiler() wird nicht benötigt, dafür hat PB den Mod-Operator.
c) Wegen des Programmierstils, und weil solche Berechnungen bei größeren Zahlen lange dauern können, ist es nicht empfehlenswert die Berechnungen doppelt auszuführen. Im Moment ermitteln die Prozeduren SummeAllerTeiler() und AusgabeAllerTeiler() beide jeweils die Teiler der als Argument übergebenen Zahl -- die erste Prozedur addiert sie dann, die zweite erzeugt einen String aus ihnen.
Bei "Mehrfachbenutzung" ist viel besser: Die Teiler nur 1x ermitteln und für die spätere Verwendung speichern. Danach kann man sie dann bequem und zeitsparend addieren, auflisten oder was immer.
d) Der Algorithmus zum Ermitteln der Teiler kann effektiver (d.h. schneller) gestaltet werden.
Hier ist ein kleiner Beispielcode, der die obigen Punkte b) bis d) berücksichtigt:
Gruß, Little John
2Andesdaf:
Für einen Beitrag im Abschnitt "Code, Tipps und Tricks" lohnen sich IMHO doch einige Verbesserungen.
Hier einiges, das mir auf den ersten Blick aufgefallen ist:
a) Du benutzt den Befehl OpenConsole nicht richtig. Er gehört nicht in die Schleife, sondern ganz an den Anfang der Ausgabe. Wenn man das Programm so wie es momentan ist startet und für die Grenzen des Zahlenbereichs beispielsweise 100 und 200 eingibt, bekommt man eine Fehlermeldung.
b) Die Prozedur IsTeiler() wird nicht benötigt, dafür hat PB den Mod-Operator.
c) Wegen des Programmierstils, und weil solche Berechnungen bei größeren Zahlen lange dauern können, ist es nicht empfehlenswert die Berechnungen doppelt auszuführen. Im Moment ermitteln die Prozeduren SummeAllerTeiler() und AusgabeAllerTeiler() beide jeweils die Teiler der als Argument übergebenen Zahl -- die erste Prozedur addiert sie dann, die zweite erzeugt einen String aus ihnen.
Bei "Mehrfachbenutzung" ist viel besser: Die Teiler nur 1x ermitteln und für die spätere Verwendung speichern. Danach kann man sie dann bequem und zeitsparend addieren, auflisten oder was immer.
d) Der Algorithmus zum Ermitteln der Teiler kann effektiver (d.h. schneller) gestaltet werden.
Hier ist ein kleiner Beispielcode, der die obigen Punkte b) bis d) berücksichtigt:
Code: Alles auswählen
EnableExplicit
Procedure ProperDivisors (n, List divisor())
; liefert alle *echten* Teiler von n (d.h. alle ohne n selbst)
; in der verknüpften Liste divisor()
Protected k
ClearList(divisor())
If n < 2
ProcedureReturn
EndIf
AddElement(divisor())
divisor() = 1
If n % 2 = 0
For k = 2 To n/2
If n % k = 0
AddElement(divisor())
divisor() = k
EndIf
Next
Else
; In diesem Fall brauchen wir nur ungerade Teiler zu suchen:
For k = 3 To Int(n/3) Step 2
If n % k = 0
AddElement(divisor())
divisor() = k
EndIf
Next
EndIf
EndProcedure
;-- Demo
Define n, last, sum.q
Define temp.s
NewList teiler()
Debug "Summe der echten Teiler von ..."
Debug ""
For n = 2 To 20
ProperDivisors(n, teiler())
last = ListSize(teiler()) - 1
temp = ""
sum = 0
ForEach teiler()
temp + Str(teiler())
If ListIndex(teiler()) < last
temp + "+"
EndIf
sum + teiler()
Next
Debug Str(n) + ": " + temp + " = " + Str(sum)
Next
-
Special-Agent-J
- Beiträge: 51
- Registriert: 05.10.2008 10:13
kranke scheiße was sind befreundete zahlen xD
gibts dann auch verfeindetete zahlen?
na ja trotzdem der code war bestimmt nicht ganz leicht zu schreiben
nice work allein schon zu verstehen was befreundete zahlen sind
p.s. hab bei wikipedia nach 2 zeilen augehört zu lesen was isn das für ne komplizierte scheiße
gibts dann auch verfeindetete zahlen?
na ja trotzdem der code war bestimmt nicht ganz leicht zu schreiben
nice work allein schon zu verstehen was befreundete zahlen sind
p.s. hab bei wikipedia nach 2 zeilen augehört zu lesen was isn das für ne komplizierte scheiße
Achtung ich hab leider nur die demo von 4.3 und von der kaufversion leider nur 3.3
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Hä.. wie jetz? Ich glaub ich spiel in Österreich auch mal Lotto, da gibts bessere ChancencxAlex hat geschrieben:Ne, in Österreich 6 aus 45 ^^
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.