Potegowanie x do n przy najmniejszej liczbie mnozen

0

Witam, gratuluje swietnego forum...
Mam problem otoz mam napisac program, ktory bedzie obliczal x do potegi n ,gdzie n jest liczba calkowita, z wykorzystaniem najmniejszej ilosci mnozen.
Zaczelem to robic w taki sposob ze sprawdzam czy potega dzieli sie przez 2, jezeli tak to robie petle i obliczam x do polowy potegi a nastepnie mnoze przez ten wlasnie wynik. Jezeli liczba nie dzieli sie przez dwa, to tez ja dziele przez dwa i robie jak wyzej tylk owynik koncowy mnoze jeszcze przez x.

Przyklad. 2 do 8, robie petle 2 do 4 i potem mnoze przez wynik. Czyli 2 do 4 x 2 do 4.
2 do 9, robie petle 2 do 4 i mnoze przez wynik i potem znow przez 2.

PS. Planuje teraz sprawdzac czy liczba dzieli sie przez 3 i tez w ten sposob kombinowac
Da sie jakos lepiej to zrobic?
Pozdrawiam

0

potęgowanie binarne - ilość mnożeń taka, jak 2*log2(wykladnik).

pseudokod (prawdziwy kod masz w bibliotece vlong)
c = a^b:

c = 1;
i = 1;

for n = 1 to 31 do // 32-1, bo 32-bitowy wykładnik
begin
  if b and i <> 0 then c = c * a;
  i = i shl 1;
  a = a * a;
end;

return c;
0

Witam, dzieki ze odpisales, niestety nic z tego nie potrafie zalapac, mozesz napisac to samo dla systemu 10??

Pozdrawiam i jeszcze raz dzieki.

0

to dziala niezaleznie od systemu

// btw. kazda liczba jest obrabiana binarnie, bo bit to podstawowa jednostaka pamieci w komputerze

0
  i = i * 2; // albo i = i shl 2; - dużo szybciej

coś ci sie chyba w tym komenatarzu pomyliło.No chyba że miedzyczasie się zmieniły przesunięcia bitowe.Poprawnie:

 i = i shl 1; 
</i>

// nie tylko to się pomyliło... - Ł

0

Witam, niestety nie rozumiem tych zapisow (mialem trzy wyklady z programowania, a mamy juz takie zadania do domu, innym robia znajomi ja chce sam sie nauczyc)...zrobilem to tak:

Program potega;
var n,m,j,s,i,u,r,z :longint;
var y:real;
begin
writeln ('wprowadz liczbe do potegowania');
read (m);
writeln ('wprowadz potege');
read (n);

if n=0 then
begin
y:=1;
end

else
if n<0 then
begin
j:=n mod 3;
if (j=0) and (n<0) then
begin
s:=n div 3;
i:=0;
z:=1;
while i<-s do
begin
z:=zm;
i:=i+1;
end;
u:=z
zz;
y:=1 / u;
end
else
if (j<>0) and (n<0) then
begin
r:=n mod 2;
if (r=0) and (n<0) then
begin
s:=n div 2;
i:=0;
z:=1;
while i<-s do
begin
z:=z
m;
i:=i+1;
end;
u:=z*z;
y:=1 / u;
end

else
if (r<>0) and (n<0) then
begin
s:=n div 2;
i:=0;
z:=1;
while i<-s do
begin
z:=zm;
i:=i+1;
end;
u:=z
z*m;
y:=1 / u;
end;
end;
end

else
if n>0 then
begin
j:=n mod 3;
if j=0 then
begin
s:=n div 3;
i:=0;
z:=1;
while i<s do
begin
z:=zm;
i:=i+1;
end;
u:=z
z*z;
y:=u;
end

else
if (n>0) and (j<>0) then

begin
r:=n mod 2;
if r=0 then
begin
s:=n div 2;
i:=0;
z:=1;
while i<s do
begin
z:=zm;
i:=i+1;
end;
u:=z
z;
y:=u;
end

else
if r<>0 then
begin
s:=n div 2;
i:=0;
z:=1;
while i<s do
begin
z:=zm;
i:=i+1;
end;
u:=z
z*m;
y:=u;
end;
end;
end;

write ('wynik:', y:3:5);
readln;
readln;
end.

Mialbym prosbe, czy moze ktos go poprawic na ten Wasz sposob, bo ja sobie jednak z tym nie poradze...
Pozdrawiam i z gory dzieki.

PS. Moze program jest banalny, ale jak dla mnie to i tak spory wyczyn (nigdy nie mialem pascala).

0

powyższy kod jest przykładem jak nie powinno się pisać programów. no ale rozumiem, że początkujący...

tu masz gotowca:

function poteguj(a,b : longint) : longint;
var
  i,n,c : longint;
begin
  c := 1;
  i := 1;

  for n := 1 to 31 do
  begin
    if b and i <> 0 then c := c * a;
    i := i shl 1;
    a := a * a;
  end;

  poteguj := c;
end;

przejedź sobie po tym debugerem (Turbo Pascal - F7, Ctrl+F4) i zobacz jak się zmieniają wartości poszczególnych zmiennych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1