-
Notifications
You must be signed in to change notification settings - Fork 2
/
primfaktoren.pas
121 lines (82 loc) · 2.55 KB
/
primfaktoren.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
{-----------------------------------------------------------------------------
Unit Name: primfaktoren
Author: Alexander Roth
This unit is licensed unter the GPL3
This license note and the original author (Alexander Roth) must not be altered.
-----------------------------------------------------------------------------}
unit primfaktoren;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,math,
nints;
type
Tiiarray=array of iinteger;
tprimzahlen= class
private
function wurzel(zahl:iinteger):iinteger;
function teilbar(zahl,m:iinteger):boolean;
function durch(divident,divisor:iinteger):iinteger;
procedure add(var ar:Tiiarray; zahl:iinteger);
public
procedure primfaktor(zahl:iinteger);
end;
var primzahlen:tprimzahlen;
faktoren : Tiiarray;
stop:boolean;
aktuellezahl,restzahl:iinteger;
implementation
uses unit1,unit3;
function tprimzahlen.wurzel(zahl:iinteger):iinteger;
begin
nsqrt(zahl);
result:=zahl;
end;
function tprimzahlen.teilbar(zahl,m:iinteger):boolean;
begin
nmod(zahl,m);
result:= ncmp(zahl,0)=0;
end;
function tprimzahlen.durch(divident,divisor:iinteger):iinteger;
begin
ndiv(divident,divisor);
result:=divident;
end;
procedure tprimzahlen.add(var ar:Tiiarray; zahl:iinteger);
begin
setlength(ar,length(ar)+1);
nset(faktoren[length(ar)-1],zahl);
end;
procedure tprimzahlen.primfaktor(zahl:iinteger);
var afaktor:iinteger;
nochprim :boolean;
begin
nochprim:=true;
if faktoren=nil then
nset(afaktor,2)
else
nset(afaktor,faktoren[length(faktoren)-1] );
while (ncmp(afaktor, wurzel(zahl))<=0) do
begin
if teilbar(afaktor,nint(100001)) then
begin
//hier kommt bla bla für die Aussenwelt
application.ProcessMessages;
nset(aktuellezahl,afaktor);
nset(restzahl,zahl);
if stop then exit;
form1.Frame11.schreibeinfofenster;
end;
//mod überpüfung
if teilbar(zahl,afaktor) then
begin
nochprim:=false;
add(faktoren,afaktor); //da das ja ein faktor ist wird er hinzugefügt
primfaktor(durch(zahl,afaktor)); //rekursion
nset(afaktor,zahl); //verlassen der schleife
end
else if ncmp(afaktor,2)=0 then nadd(afaktor,1) else nadd(afaktor,2); //erhöhe um 2
end;
if nochprim then add(faktoren,zahl); //die faktoren, die keine weitere Teiler haben werden hier hinzugefügt
end ;
end.