複製鏈接
請複製以下鏈接發送給好友

高精度減法

鎖定
高精度減法和高精度加法相比,減法在差為負數時處理的細節更多一點。
中文名
高精度減法
細    節
判斷被減數與減數的大小
相    比
高精度加法
算法流程
讀入被減數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
{————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]
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
if c
if c
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;
}