高精度減法

高精度減法高精度加法相比,減法在差為負數時處理的細節更多一點。

基本介紹

  • 中文名:高精度減法
  • 細節:判斷被減數與減數的大小
  • 相比高精度加法
  • 算法流程:讀入被減數S1,S2
介紹,程式,

介紹

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:='-';s:=s1; s1:=s2; s2:=s; end;
{————s1存被減數,符號存符號}
②通過數組分析完成大小比較(當數值長度超過256位時發揮重要作用)
readln(s);{輸入整個算式,即'a+b='}
l1:=pos('-',s);(搜尋'-'的位置)
for i:=1 to l1-1 do {從字元串中分離出數值A}
a[l1-i]:=ord(s[i])-48;
dec(l1);{將'-'號位置轉換為數值A的長度}
x2:=length(s);{獲取算式長度}
l2:=x2-l1-2;{得到數值B長度}
for i:=l1+2 to x2 do{將數值B分離出}
b[x2-i]:=ord(s[i])-48;
if l2>l1 then p:=true{開始分析數值AB的大小,如果B位數高則B更大}
else if l2=l1 then{如果相等則進入詳細分析}
begin
i:=l1;
while (i>0)and(a[i]=b[i]) do dec(i);{從高到低依次檢索AB每位的大小,如果有非等於則退出}
if a[i]<b[i] then p:=true;{最終判斷數值AB的大小}
end;
▲將字元串處理成數值:
l:=length(s1);{求出s1的長度,也即s1的位數;有關字元串的知識。}
k1:=260;
for i:=l downto 1 do
begin
a[k1]:=ord(s1)-48;{將字元轉成數值}
k1:=k1-1;
end;
k1:=k1+1;
▲列印結果:
例:差:第一位是12,第二位是234,第三位是1234,最後一位:3。它的實際數值是12。
從上例可以看出:列印時,從第二位開始,因為每一段都代表4位,不足4位的要補足0。
write(fh,c[k]);{k是差的第1位;}
for i:=k+1 to 260 do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;

程式

PASCAL程式
Program a1;
var a,b,c:array [1..100] of integer;
x2,l1,l2,i:integer;
p:boolean;
s:string;
begin
readln(s);
l1:=pos('-',s);
for i:=1 to l1-1 do
a[l1-i]:=ord(s[i])-48;
dec(l1);
x2:=length(s);
l2:=x2-l1-2;
for i:=l1+2 to x2 do
b[x2-i]:=ord(s[i])-48;
if l2>l1 then p:=true
else if l2=l1 then
begin
i:=l1;
while (i>0)and(a[i]=b[i]) do dec(i);
if a[i]<b[i] then p:=true;
end;
if p then
begin
for i:=1 to l2 do c[i]:=b[i]-a[i];
for i:=1 to l2 do
if c[i]<0 then
begin
c[i]:=c[i]+10;
dec(c[i+1]);
end;
i:=l2;
while c[i]=0 do dec(i);
write('-');
for l2:=i downto 1 do write(c[i]);
writeln;
end
else
begin
for i:=1 to l1 do c[i]:=a[i]-b[i];
for i:=1 to l1 do
if c[i]<0 then
begin
c[i]:=c[i]+10;
dec(c[i+1]);
end;
i:=l1;
while c[i]=0 do dec(i);
for l1:=i downto 1 do write(c[i]);
writeln;
end;
C++程式
int a[1000], b[1000];char sa[1000], sb[10000];int c[1000];int f(int la, int lb){    if (la>lb) return 1;//true    if (la<lb) return 0;//false    for (int i = la - 1; i >= 0; i--) {        if (a[i]>b[i]) {            return 1;            break;        }        if (a[i]<b[i]) {            return 0;            break;        }    }    return 1;}int largesub(char *sa, char *sb, int *c)//lc是c數組的元素個數{    int la, lb, lc;    int t;    la = strlen(sa);    lb = strlen(sb);    memset(a, 0, sizeof(a));    memset(b, 0, sizeof(b));    memset(c, 0, 1000*4);//一個整型是4個位元組,所以要乘以4    for (int i = 0; i < la; i++)        a[la - i - 1] = sa[i] - '0';    for (int i = 0; i < lb; i++)        b[lb - i - 1] = sb[i] - '0';    t = f(la, lb);    if (la > lb) lc = la; else lc = lb;    if (t == 1) {        for (int i = 0; i < lc; i++) {            if (a[i] < b[i]) { a[i + 1] -= 1; a[i] += 10; }            c[i] = a[i] - b[i];        }        if (c[lc] > 0) lc++;        if (lc >= 2 && c[lc - 1] == 0){            while (c[lc - 1] == 0 && lc >= 2){                c[lc - 1] = '\0';                lc--;            }        }    }    if (t == 0) {        for (int i = 0; i < lc; i++) {            if (b[i] < a[i]) { b[i + 1] -= 1; b[i] += 10; }            c[i] = b[i] - a[i];        }        if (c[lc] > 0) lc++;        printf("-");        if (lc >= 2 && c[lc - 1] == 0){            while (c[lc - 1] == 0 && lc >= 2){                c[lc - 1] = '\0';                lc--;            }        }    }    return lc;}

相關詞條

熱門詞條

聯絡我們