如何寫出mod |
|
s556989
一般會員 發表:5 回覆:1 積分:1 註冊:2006-07-19 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
s556989
一般會員 發表:5 回覆:1 積分:1 註冊:2006-07-19 發送簡訊給我 |
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Button2: TButton; Button3: TButton; Button4: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function OPAdd(var s:string;id,value:integer):integer; var ss,sv:string; begin Result:=0; if id<=0 then begin sv:=inttostr(value); s:=sv s; Result:=length(sv); end else begin ss:=intTostr(ord(s[id])-48 value); if length(ss) > 1 then begin s[id]:=ss[2]; Result:=OPAdd(s, id-1, ord(ss[1])-48); end else s[id]:=ss[1]; end; end; procedure OPSub(var s:string;id,value:integer); var r:integer; begin if id=0 then s:='-' s else begin r:=ord(s[id])-48-value; if r < 0 then begin r:=r 10; OPsub(s, id-1, 1); end; s[id]:=chr(r 48); end; end; function InfinitAdd(s1,s2:string):string; var i,n1,n2:integer; begin n1:=length(s1); n2:=length(s2); if n2 > n1 then Result:=InfinitAdd(s2,s1) else begin Result:=s1; for i:=1 to n2 do n1:=n1 OPadd(Result,n1-n2 i, ord(s2[i])-48); end; end; function InfinitSub(s1,s2:string):string; var i,n1,n2:integer; begin n1:=length(s1); n2:=length(s2); if ( (n2 > n1) or ((n2=n1) and (s1 < s2))) then Result:='-' InfinitSub(s2,s1) else begin Result:=s1; for i:=1 to n2 do OPSub(Result,n1-n2 i, ord(s2[i])-48); end; end; function Infinitmul(s1,s2:string):string; var i,j,n1,n2,n:integer; begin n1:=length(s1); n2:=length(s2); if n2 > n1 then Result:=InfinitMul(s2,s1) else begin n:=n1; Result:=StringofChar('0',n1); for i:=1 to n2 do for j:=n1 downto 1 do n:=n OPAdd(Result,n-n1-n2 i j,(ord(s2[i])-48) * (ord(s1[j])-48)); end; end; procedure DeleteLD0(var s:string); begin while (s[1]='0') and (length(s)>1) do delete(s,1,1); end; function _InfinitDiv(s1,s2:string;var res:string):string; var n1,n2,n,r:integer; c:char; stemp:string; begin n1:=length(s1); n2:=length(s2); if ( (n2 > n1) or ((n2=n1) and (s1< s2))) then begin Result:=''; res:=s1; end else begin n := n1 - n2-1; if s2[1] <= s1[1] then inc(n); if s1[1] >= s2[1] then r:= (ord(s1[1])-48) div (ord(s2[1])-48) else r:=strToint(res[1] res[2]) div (ord(s2[1])-48); repeat if r=0 then begin dec(n); r:=9; Result:='0'; end; c:= chr(r 48); stemp:=c StringofChar('0',n); res:= infinitsub(s1, infinitmul(s2,stemp)); DeleteLD0(res); dec(r); until res[1] <> '-'; Result:=Result infinitAdd(stemp,_infinitDiv(res, s2, res)); end; end; function InfinitDiv(s1,s2:string):string; var res:string; begin result:=_InfinitDiv(s1,s2,res); if result='' then result:='0'; end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.caption:=InfinitAdd(edit1.text,edit2.text); end; procedure TForm1.Button2Click(Sender: TObject); begin Label1.caption:=InfinitSub(edit1.text,edit2.text); end; procedure TForm1.Button3Click(Sender: TObject); begin Label1.caption:=InfinitMul(edit1.text,edit2.text); end; procedure TForm1.Button4Click(Sender: TObject); begin Label1.caption:=InfinitDiv(edit1.text,edit2.text); end; end. P.S:若有網友認為您可以寫出更好的演算法,就再接力賽吧! ~~~Delphi K.Top討論區站長~~~ 如站長之前寫的方式 如何寫出一個Mod的方式!! |
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |