Informatika gyűjtemény

Egy szinttel feljebb pr_collatz.pas

2004050607080910

NézetNyomtat

pr_collatz.pas (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 1 KB
program nagy;

type nagyszam=record jegy:array[0..1000] of byte; h:integer; end;

var n,m,o:nagyszam; s:string;

procedure init(var n:nagyszam); //ha azt irjuk, hogy var, akkor az igazibol is
var i:integer;                  //atirja n ereteket, nem csak itt...
begin
n.h:=1;
for i:=0 to 1000 do n.jegy[i]:=0;
end;

procedure initl(var n:nagyszam; l:longint);
begin
init(n);
n.h:=0;
if l=0 then n.h:=1 else begin
while l>0 do begin
inc(n.h);
n.jegy[n.h]:=mod 10;
l:=div 10;
end; end; end;

procedure inits(var n:nagyszam; s:string);
var liba:integer;
begin
init(n);
n.h:=0;
while length(s)>0 do begin
inc(n.h);
val(s[length(s)],n.jegy[n.h],liba);
delete(s,length(s),1);
end;
end;

procedure ki(n:nagyszam);
var i:integer;
begin
for i:=n.downto 1 do write(n.jegy[i]); writeln;
end;

procedure nagyit(var n:nagyszam; l:longint);
var j:integer;
begin
n.h:=n.h+l;
for j:=n.downto l+1 do n.jegy[j]:=n.jegy[j-l];
for j:=1 to l do n.jegy[j]:=0;
end;

function ad(a,b:nagyszam):nagyszam;
var c:nagyszam; i,r:integer;
begin
init(c);
r:=0;
for i:=1 to 1000 do begin
c.jegy[i]:=(a.jegy[i]+b.jegy[i]+r) mod 10;
r:=(a.jegy[i]+b.jegy[i]+r) div 10;
if (c.jegy[i]>0) then c.h:=i;
end;
ad:=c;
end;

function szor(a,b:nagyszam):nagyszam;
var i,j:integer; c:nagyszam;
begin
init(c);
for i:=1 to b.do begin
for j:=1 to b.jegy[i] do begin
c:=ad(c,a);
end;
nagyit(a,1);
end;
szor:=c;
end;

function felez(a:nagyszam):nagyszam;
var i,r:integer;
begin
init(felez);
r:=0;
for i:=a.downto 1 do begin
felez.jegy[i]:=(a.jegy[i]+r*10) div 2;
r:=(a.jegy[i]+r*10) mod 2;
end;
if felez.jegy[a.h]=0 then felez.h:=a.h-1 else felez.h:=a.h;
if felez.h=0 then felez.h:=1;

end;

procedure hkpe(a:nagyszam);
var c:nagyszam;
begin
while (a.h>1) or (a.jegy[1]>1) do begin
ki(a);
if (a.jegy[1] mod 2) = 0 then a:=felez(a) else begin
initl(c,3); a:=szor(a,c); initl(c,1); a:=ad(a,c);
end;

end;
ki(a);

end;


begin
//init(n); inits(n,'1000');
//init(m); initl(m,911112);
//n:=szor(n,m);
//m:=felez(m); ki(m);
readln(s);
inits(n,s); hkpe(n);
//n:=ad(n,n); ki(n);

end.
(Vissza)