23. november 2003 - 13:56Der er
47 kommentarer og 1 løsning
Delphi hjælp plz.
Hej allesammen
Jeg har nogle ting, som jeg simpelthen ikke kan finde ud af i delphi. Jeg har fået som opgaver at: 1. Bestem cifrene i tallenen 2^10 og 2^100 når de skrives i decimalsystemet? Find ud af hvordan tallene ser ud i det binære talsystem.
2. Hvor mange cifre er der i tallet 3^1000 når det skrives i decimalsystemet? Hvor mange af cifrene er nuller?
3. Hvor mange cifre er der i tallet 3^1000 når det skrives i det binære talsystem? Hvor mange af cifrene er nuller?
4. Hvad er ciffer nr.2006 i tallet 2^100000 når det skrives i decimalsystemet?
Jeg skal bruge kode til alle spørgsmål. da jeg ikke selv kan finde ud af det.
begin res := ''; carry := 0; ix1 := length(v1); ix2 := length(v2); while (carry > 0) or (ix1 > 0) or (ix2 > 0) do begin tmp := carry; if(ix1 > 0) then begin tmp := tmp + numval(v1[ix1]); ix1 := ix1 - 1; end; if(ix2 > 0) then begin tmp := tmp + numval(v2[ix2]); ix2 := ix2 - 1; end; res := strval(tmp mod 10) + res; carry := tmp div 10; end; add := res; end;
function mulpow10(v : string; pow10 : integer) : string;
var res : string; i : integer;
begin res := v; for i := 1 to pow10 do begin res := res + '0'; end; mulpow10 := res; end;
function mulone(v : string; num : integer) : string;
var res : string; ix, tmp, carry : integer;
begin res := ''; carry := 0; ix := length(v); while (carry > 0) or (ix > 0) do begin tmp := carry; if(ix > 0) then begin tmp := tmp + num * numval(v[ix]); ix := ix - 1; end; res := strval(tmp mod 10) + res; carry := tmp div 10; end; mulone := res; end;
function mul(v1,v2 : string) : string;
var res : string; i : integer;
begin res := '0'; for i := 1 to length(v2) do begin res := add(res,mulpow10(mulone(v1,numval(v2[i])),length(v2)-i)); end; mul := res; end;
function pow(v : string; n : integer) : string;
var res : string; i : integer;
begin res := '1'; for i := 1 to n do begin res := mul(res,v); end; pow := res; end;
begin writeln(pow('2',10)); writeln(pow('2',100)); writeln(length(pow('3',1000))); writeln(pow('2',100000)[2006]); end.
Jeg vil gerne bruge din kode. For jeg er heller ikke særlig god. Så du må gerne skrive kommentarer. Pointsene er ihvertfald dine. Hvorfor tager det egentlig så lang tid for at regne 2^10000.
(* konvertering fra tekst tal til rigtigt tal: numval('1') giver 1 *) function numval(c : char) : integer;
begin numval := ord(c) - ord('0'); end;
(* konvertering fra rigtigt tal til tekst tal: strval(1) giver '1' *) function strval(v : integer) : char;
begin strval := chr(ord('0') + v); end;
(* lig to tal sammen: add('123','10') giver '133' *) (* standard algoritme man starter bagfra og husker menten (carry) *) function add(v1,v2 : string) : string;
var res : string; ix1, ix2, tmp, carry : integer;
begin res := ''; carry := 0; ix1 := length(v1); ix2 := length(v2); while (carry > 0) or (ix1 > 0) or (ix2 > 0) do begin tmp := carry; if(ix1 > 0) then begin tmp := tmp + numval(v1[ix1]); ix1 := ix1 - 1; end; if(ix2 > 0) then begin tmp := tmp + numval(v2[ix2]); ix2 := ix2 - 1; end; res := strval(tmp mod 10) + res; carry := tmp div 10; end; add := res; end;
(* gang et tal med en potens af 10: mulpow('123',2) giver '12300' *) function mulpow10(v : string; pow10 : integer) : string;
var res : string; i : integer;
begin res := v; for i := 1 to pow10 do begin res := res + '0'; end; mulpow10 := res; end;
(* gange strot tal med lille tal: mulone('123',2) gicer '246' *) (* standard algoritme man starter bagfra og husker menten (carry) *) function mulone(v : string; num : integer) : string;
var res : string; ix, tmp, carry : integer;
begin res := ''; carry := 0; ix := length(v); while (carry > 0) or (ix > 0) do begin tmp := carry; if(ix > 0) then begin tmp := tmp + num * numval(v[ix]); ix := ix - 1; end; res := strval(tmp mod 10) + res; carry := tmp div 10; end; mulone := res; end;
(* gang to tal sammen: mul('12','12') giver '144' *) (* standard algoritme man tager et ciffer fra det andet tal og ganger med, rykker ud og ligger sammen *) function mul(v1,v2 : string) : string;
var res : string; i : integer;
begin res := '0'; for i := 1 to length(v2) do begin res := add(res,mulpow10(mulone(v1,numval(v2[i])),length(v2)-i)); end; mul := res; end;
(* potens funktion: pow('12',2) giver '144' *) (* standard algoritme med en løkke som ganger det nødvendige antal gange *) function pow(v : string; n : integer) : string;
var res : string; i : integer;
begin res := '1'; for i := 1 to n do begin res := mul(res,v); end; pow := res; end;
tak, men det der forstår jeg altså intet af. Jeg har brug for en kommentar til hver eneste sætning. Kunne du ikke skrive kommentar efter hvert sætning? Og når du skriver kommentar, så sætte // foran kommentarne.
begin res := ''; // resultat = ingenting carry := 0; // mente = nul ix1 := length(v1); // start med sidste ciffer i første tal ix2 := length(v2); // start med sidste ciffer i andet tal while (carry > 0) or (ix1 > 0) or (ix2 > 0) do begin // så længe der noget tmp := carry; // resultat ciffer = menten if(ix1 > 0) then begin tmp := tmp + numval(v1[ix1]); // hvis der er noget tilbage af første tal lig ciffer til resulat ciffer ix1 := ix1 - 1; end; if(ix2 > 0) then begin tmp := tmp + numval(v2[ix2]); // hvis der er noget tilbage af andet tal lig ciffer til resultat ciffer ix2 := ix2 - 1; end; res := strval(tmp mod 10) + res; // gem resulat ciffer (kun 1 ciffer( carry := tmp div 10; // resten ryger med som ny mente end; add := res; end;
function mulone(v : string; num : integer) : string;
var res : string; ix, tmp, carry : integer;
begin res := ''; // resultat = ingenting carry := 0; // mente = nul ix := length(v); // start med sidste ciffer i det store tal while (carry > 0) or (ix > 0) do begin // så længe der er noget tmp := carry; // resultat ciffer = menten if(ix > 0) then begin tmp := tmp + num * numval(v[ix]); // hvis der er noget tilbage lig ciffer til resultat ciffer ix := ix - 1; end; res := strval(tmp mod 10) + res; // gem resultat ciffer (kun 1 ciffer) carry := tmp div 10; // resten ryger med som ny mente end; mulone := res; end;
Jeg har svært ved at se hvordan 3^ kan løses anderledes.
Men 2^ kan man jo uhyre nemt lave en binær repæsentation af. Problemet er at få omregnet til decimal. Integer division er en ubehagelig operation at implementere.
Jeg har lige et spørgsmål. Hvor skriver du under hver funktion til sidst: funktionens navn:= res; Jeg troede at man skulle skrive result:=res; Er det bare fordi at man kan gøre begge dele?
procedure TForm1.Button1Click(Sender: TObject); begin Form1.Edit1.Text:=pow('2',10); Form1.Edit2.Text:=pow('2',100); Form1.Edit3.Text:=pow('3',1000);
end;
og når jeg i stedet skriver: procedure TForm1.Button1Click(Sender: TObject); begin Form1.Edit1.Text:=pow('2',10); Form1.Edit2.Text:=pow('2',100); Form1.Edit3.Text:=length(pow('3',1000));
end;
så får jeg fejlen: [Error] Rapport.pas(165): Incompatible types: 'String' and 'Integer'
Kunne du gøre sådan så jeg også kunne finde ud af hvor mange cifra der var i tallet 3^1000 når det skrives i binære talsystem?, og regne ud hvormange af cifrene der er nuller. + regne ud hvormange af cifrene der er nuller i de andre, som du har lavet?
Her er en variant som kører binært i.s.f. decimalt (grundliggende har jeg bare erstattet 10 med 2 i de samme funktioner):
program BigPowVar;
{$APPTYPE CONSOLE}
uses SysUtils;
function numval(c : char) : integer;
begin numval := ord(c) - ord('0'); end;
function strval(v : integer) : char;
begin strval := chr(ord('0') + v); end;
function add(v1,v2 : string) : string;
var res : string; ix1, ix2, tmp, carry : integer;
begin res := ''; carry := 0; ix1 := length(v1); ix2 := length(v2); while (carry > 0) or (ix1 > 0) or (ix2 > 0) do begin tmp := carry; if(ix1 > 0) then begin tmp := tmp + numval(v1[ix1]); ix1 := ix1 - 1; end; if(ix2 > 0) then begin tmp := tmp + numval(v2[ix2]); ix2 := ix2 - 1; end; res := strval(tmp mod 2) + res; carry := tmp div 2; end; add := res; end;
function mulpow2(v : string; pow2 : integer) : string;
var res : string; i : integer;
begin res := v; for i := 1 to pow2 do begin res := res + '0'; end; mulpow2 := res; end;
function mulone(v : string; num : integer) : string;
var res : string; ix, tmp, carry : integer;
begin res := ''; carry := 0; ix := length(v); while (carry > 0) or (ix > 0) do begin tmp := carry; if(ix > 0) then begin tmp := tmp + num * numval(v[ix]); ix := ix - 1; end; res := strval(tmp mod 2) + res; carry := tmp div 2; end; mulone := res; end;
function mul(v1,v2 : string) : string;
var res : string; i : integer;
begin res := '0'; for i := 1 to length(v2) do begin res := add(res,mulpow2(mulone(v1,numval(v2[i])),length(v2)-i)); end; mul := res; end;
function pow(v : string; n : integer) : string;
var res : string; i : integer;
begin res := '1'; for i := 1 to n do begin res := mul(res,v); end; pow := res; end;
function fastpow(v : string; n : integer) : string;
var res : string;
begin writeln(v,' ',n); if n=1 then begin res := v; end else begin if odd(n) then begin res := mul(v,fastpow(mul(v,v),n div 2)); end else begin res := fastpow(mul(v,v),n div 2); end; end; fastpow := res; end;
begin writeln(pow('2',10)); writeln(pow('2',100)); writeln(length(pow('3',1000))); end.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.