高精度減法

高精度減法,和高精度加法相比,減法在差為負數時處理的細節更多一點:當被減數小於減數時,差為負數,差的絕對值是減數減去被減數;在程式實現上用一個變數來存儲符號位,用另一個數組存差的絕對值。

高精度減法
1、和高精度加法相比,減法在差為負數時處理的細節更多一點:當被減數小於減數時,差為負數,差的絕對值是減數減去被減數;在程式實現上用一個變數來存儲符號位,用另一個數組存差的絕對值。
2、算法流程:
(1)讀入被減數S1,S2(字元串);
(2)置符號位:判斷被減數是否大於減數:大則將符號位置為空;小則將符號位置為“-”,交換減數與被減數;
(3)被減數與減數處理成數值,放在數組中;
(4)運算:
A、取數;
B、判斷是否需要借位;
C、減,將運算結果放到差數組相應位中;
D、判斷是否運算完成:是,轉5;不是,轉A;
(5)列印結果:符號位,第1位,循環處理第2到最後一位;
3、細節:
▲如何判斷被減數與減數的大小:字元串知識
①(1)首先將兩個字元串的位數補成一樣(因為字元串的比較是從左邊對齊的;兩個字元串一樣長才能真正地比較出大小):短的在左邊補0
k1:=length(s1);
k2:=length(s2);
if k1>k2 then for i:=1 to k1-k2 do s2:='0'+s2
else for i:=1 to k2-k1 do s1:='0'+s1;
(2)接著比較大小:直接比較字元串大小
fh:='';
if s1<s2 then begin fh:=&#039;-&#039;;s:=s1; s1:=s2; s2:=s; end;
{————s1存被減數,符號存符號}
②通過數組分析完成大小比較(當數值長度超過256位時發揮重要作用)
readln(s);{輸入整個算式,即&#039;a+b=&#039;}
l1:=pos(&#039;-&#039;,s);(搜尋&#039;-&#039;的位置)
for i:=1 to l1-1 do {從字元串中分離出數值A}
a&#91;l1-i&#93;:=ord(s&#91;i&#93;)-48;
dec(l1);{將&#039;-&#039;號位置轉換為數值A的長度}
x2:=length(s);{獲取算式長度}
l2:=x2-l1-2;{得到數值B長度}
for i:=l1+2 to x2 do{將數值B分離出}
b&#91;x2-i&#93;:=ord(s&#91;i&#93;)-48;
if l2>l1 then p:=true{開始分析數值AB的大小,如果B位數高則B更大}
else if l2=l1 then{如果相等則進入詳細分析}
begin
i:=l1;
while (i>0)and(a&#91;i&#93;=b&#91;i&#93;) do dec(i);{從高到低依次檢索AB每位的大小,如果有非等於則退出}
if a&#91;i&#93;<b&#91;i&#93; then p:=true;{最終判斷數值AB的大小}
end;
▲將字元串處理成數值:
l:=length(s1);{求出s1的長度,也即s1的位數;有關字元串的知識。}
k1:=260;
for i:=l downto 1 do
begin
a&#91;k1&#93;:=ord(s1)-48;{將字元轉成數值}
k1:=k1-1;
end;
k1:=k1+1;
▲列印結果:
例:差:第一位是12,第二位是234,第三位是1234,最後一位:3。它的實際數值是12023412340003。
從上例可以看出:列印時,從第二位開始,因為每一段都代表4位,不足4位的要補足0。
write(fh,c&#91;k&#93;);{k是差的第1位;}
for i:=k+1 to 260 do
begin
if c<1000 then write(&#039;0&#039;);
if c<100 then write(&#039;0&#039;);
if c<10 then write(&#039;0&#039;);
write(c);
end;
程式原始碼:
{PASCAL}
Program a1;
var a,b,c:array &#91;1..100&#93; of integer;
x2,l1,l2,i:integer;
p:boolean;
s:string;
begin
readln(s);
l1:=pos(&#039;-&#039;,s);
for i:=1 to l1-1 do
a&#91;l1-i&#93;:=ord(s&#91;i&#93;)-48;
dec(l1);
x2:=length(s);
l2:=x2-l1-2;
for i:=l1+2 to x2 do
b&#91;x2-i&#93;:=ord(s&#91;i&#93;)-48;
if l2>l1 then p:=true
else if l2=l1 then
begin
i:=l1;
while (i>0)and(a&#91;i&#93;=b&#91;i&#93;) do dec(i);
if a&#91;i&#93;<b&#91;i&#93; then p:=true;
end;
if p then
begin
for i:=1 to l2 do c&#91;i&#93;:=b&#91;i&#93;-a&#91;i&#93;;
for i:=1 to l2 do
if c&#91;i&#93;<0 then
begin
c&#91;i&#93;:=c&#91;i&#93;+10;
dec(c&#91;i+1&#93;);
end;
i:=l2;
while c&#91;i&#93;=0 do dec(i);
write(&#039;-&#039;);
for l2:=i downto 1 do write(c&#91;i&#93;);
writeln;
end
else
begin
for i:=1 to l1 do c&#91;i&#93;:=a&#91;i&#93;-b&#91;i&#93;;
for i:=1 to l1 do
if c&#91;i&#93;<0 then
begin
c&#91;i&#93;:=c&#91;i&#93;+10;
dec(c&#91;i+1&#93;);
end;
i:=l1;
while c&#91;i&#93;=0 do dec(i);
for l1:=i downto 1 do write(c&#91;i&#93;);
writeln;
end;
end.
{水平不足之處請見諒}

相關詞條

熱門詞條

聯絡我們