全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1357
推到 Plurk!
推到 Facebook!

請問一下,要怎麼寫出可以乘出兩百位數的乘法?

答題得分者是:st33chen
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-19 10:55:59 IP:220.140.xxx.xxx 訂閱
請問一下,要怎麼寫出可以乘出兩百位數的乘法?

1234→四位數,12345→五位數。

就是兩個數乘完最高可以到200位數的乘法。

本來想說用Int64,可是好像也不夠大。

最後我是想將乘法轉為加法,並將數字切割以加法計算,可是我不會切割,有誰可以指點我一下?

P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-19 11:59:29 IP:61.67.xxx.xxx 未訂閱
9999 * 99999 = 999890001 --> 也只有九位數, 兩百位數?? 哇塞, 怎麼乘的, 我很想知道!
===================引 用 tokiama 文 章===================
請問一下,要怎麼寫出可以乘出兩百位數的乘法?

1234→四位數,12345→五位數。

就是兩個數乘完最高可以到200位數的乘法。

本來想說用Int64,可是好像也不夠大。

最後我是想將乘法轉為加法,並將數字切割以加法計算,可是我不會切割,有誰可以指點我一下?

tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-19 13:46:28 IP:220.140.xxx.xxx 訂閱
恩.....

這是老師出給我們的課題....

他說可以用字串去算。

順便問一下,一個文字方塊(Edit)最多可以輸入幾個字?
編輯記錄
tokiama 重新編輯於 2009-04-19 15:43:11, 註解 無‧
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-19 16:35:46 IP:59.112.xxx.xxx 訂閱
這個題目好久以前有看過領航天使站長貼過,好多前輩提供想法,有很多不同的做法喔
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-19 17:01:44 IP:122.116.xxx.xxx 未訂閱
您好,
很早就想試一下大整數乘法的題目, 一直有心無空, 今天正好試寫了一個, 參考一下.

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 (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-04-19 17:10:39, 註解 無‧
st33chen 重新編輯於 2009-04-20 08:44:04, 註解 無‧
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-19 18:37:23 IP:220.140.xxx.xxx 訂閱
 我有試過用1000000000000000000000000000000*1000000000000000000000000000000好像還是可以說。

可是用

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

會出現一些怪怪的科學符號說。
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-19 19:01:30 IP:59.112.xxx.xxx 訂閱
我也寫了一個,就是照我上面說的邏輯寫成程式的 假設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, 註解 無‧
系統時間:2024-05-19 15:36:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!