請問一下,要怎麼寫出可以乘出兩百位數的乘法? |
答題得分者是:st33chen
|
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
|
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
這個題目好久以前有看過領航天使站長貼過,好多前輩提供想法,有很多不同的做法喔
http://delphi.ktop.com.tw/board.php?cid=30&fid=70&tid=23866 就你所說字串乘法,我可以提供一個想法 就我所學乘法的演算是這樣 543 x 123 --------------- 1629 1086 543 --------------- 66789 也就是可以把543*123 改成 543*3 (543*2)移動1位 (543*1)移動兩位 而 543*3 又是 3*3=9 取9 , 4*3=12 取2 進1 , 5*3=15 取5( 前面進1=6) 進1 照這個邏輯翻譯成程式就可以完成200位數的乘法
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-04-19 16:48:33, 註解 無‧
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
很早就想試一下大整數乘法的題目, 一直有心無空, 今天正好試寫了一個, 參考一下. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Label1: TLabel; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const digits = 3; // 每組字串長度, 計畫為 5, 用小於 5 測試 若要測大整數請放大至 5 或 6 var Form1: TForm1; astr, fstr : string; ii, jj, kk : integer; mylist1, mylist2, mylist3 : tstringlist; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var num1 : real; begin // 測試用的數字 edit1.text := '2447'; edit2.text := '536'; // 測試用對結果用的 label1.Caption := floattostr(strtofloat(edit1.text)*strtofloat(edit2.text)); // 清空 mylist1, mylist2, mylist3 mylist1.Clear; mylist2.Clear; mylist3.clear; // 輸入字串長度假設為 max 100, 每組 5, 故各有 20絧 for ii := 0 to 19 do begin mylist1.Add(''); mylist2.Add(''); end; // 結果字串長度為 200, 每組 5, 故有 40 組 for ii := 0 to 39 do begin mylist3.add(''); end; // 第一數依每 digits 為一組放入 mylist1 astr := edit1.text; ii := 19; jj := length(astr); while jj>0 do begin if jj<=digits then begin mylist1.strings[ii] := astr; jj :=0; end else begin mylist1.strings[ii] := copy(astr, jj-digits 1, digits); astr := copy(astr,1,jj-digits); jj := length(astr); ii := ii-1; end; end; // 第二數依每 digits 為一組放入 mylist2 astr := edit2.text; ii := 19; jj := length(astr); while jj>0 do begin if jj<=digits then begin mylist2.strings[ii] := astr; jj :=0; end else begin mylist2.strings[ii] := copy(astr, jj-digits 1, digits); astr := copy(astr,1,jj-digits); jj := length(astr); ii := ii-1; end; end; // 開始做 multiply for ii := 19 downto 0 do begin num1 := strtofloatdef(mylist1.strings[ii],0); if num1>0 then begin // multiply, 結果放入 mylist3 for jj := 19 downto 0 do begin kk := ii jj 1; if mylist3.strings[kk]<>'' then mylist3.Strings[kk] := floattostr(strtofloat(mylist3.Strings[kk]) num1 * strtofloatdef(mylist2.Strings[jj],0)) else begin mylist3.Strings[kk] := floattostr(num1 * strtofloatdef(mylist2.Strings[jj],0)); end; end; // 進位 for jj := 39 downto 0 do begin kk := length(mylist3.strings[jj])-digits; if kk>0 then begin astr := mylist3.strings[jj]; mylist3.Strings[jj-1] := floattostr(strtofloat(mylist3.Strings[jj-1]) strtofloat(copy(astr,1,kk))); mylist3.Strings[jj] := copy(astr,kk 1, digits); end; end; // showmessage(mylist3.Text); end; end; // show 出結果, 先去掉領頭 0 ii :=0; while strtofloatdef(mylist3.Strings[ii],0)=0 do ii := ii 1; // 組成結果字串 astr := mylist3.strings[ii]; fstr := copy('0000000000000000000000000000000000', 1, digits); for jj := ii 1 to 39 do begin astr := astr formatfloat(fstr, strtofloatdef(mylist3.Strings[jj],0)); end; showmessage(astr); end; procedure TForm1.FormShow(Sender: TObject); begin mylist1 := tstringlist.Create; mylist2 := tstringlist.Create; mylist3 := tstringlist.Create; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin mylist1.Free; mylist2.Free; mylist3.free; end; end. 註, 我只有四位整數測, 可以, 不知大數字會如何, 如果您有 "有答案的大整數實例", 請告訴我, 好讓我也測一下, 3Q.
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
我有試過用1000000000000000000000000000000*1000000000000000000000000000000好像還是可以說。
可是用 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 乘 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 會出現一些怪怪的科學符號說。 |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
我也寫了一個,就是照我上面說的邏輯寫成程式的 假設5643 x 783
首先先做一個function 專門處理下面這種兩字串相加的情形 354 698 ---------------- 7334 然後利用function把乘法變成 5643 x3 =16929 , 5643x8 =45144, 5643*7 = 39501 5643 X 3 -------------- 9 12 18 15 ---------------- 16929 最後也是用相同一個function處理 16929 45144 39501 ----------------- 放edit1 , edit2 , 在一個按鈕 [code delphi] //字串移位後疊加 function TForm1.StrShiftAdd(LowStr, HighStr: String;ShiftCount:integer): String; var i,iLen:integer; iArr:array of integer; begin // 先補齊位數,然後再把每個單元加好再處理進位 Result := ''; HighStr := HighStr StringOfChar('0',ShiftCount); LowStr := StringOfChar('0', Length(HighStr)-Length(LowStr)) LowStr; iLen := length(HighStr) ; SetLength( iArr,iLen); for i := iLen downto 1 do //先全部加 iArr[i-1] := StrToInt(LowStr[i]) StrToInt(HighStr[i]) ; for i := High(iArr) downto Low(iArr) 1 do //處理進位 if iArr[i] > 9 then begin iArr[i] := iArr[i] - 10 ; iArr[i-1] := iArr[i-1] 1; end; for i := High(iArr) downto Low(iArr) do //轉回字串 Result := IntToStr(iArr[i]) Result ; end; procedure TForm1.Button2Click(Sender: TObject); var sl:TStringList; s:string; i,j:integer; begin sl := TStringList.Create; for i := Length(edit2.Text) downto 1 do begin s := '0'; for j := Length(edit1.Text) downto 1 do begin s := StrShiftAdd( s, IntToStr( StrToInt(Edit2.Text[i]) * StrToInt(Edit1.Text[j])) , Length(edit1.Text)-j ); end; sl.Add(s); end; ShowMessage(sl.Text); //如果是 5643x783 這邊會顯示16929 , 45144 , 39501 s:='0'; for i := 0 to Length(Edit2.Text)-1 do begin s := StrShiftAdd(s , sl.Strings[i] , i ); end; Showmessage(s); sl.Free; end; [/code]
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-04-19 19:09:19, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |