请输入您要查询的百科知识:

 

词条 高精度减法
释义

高精度减法

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。它的实际数值是12023412340003。

从上例可以看出:打印时,从第二位开始,因为每一段都代表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;

end.

{水平不足之处请见谅}

#include<fstream>

#include<iostream>

#include<string.h>

using namespace std;

char a[1000]={0},b[1000]={0},d[1000],c[1000]={0};int l1,l2,k,i;

int main()

{

ifstream cin("1.txt",ios::in);

cin.getline(c,1000);

cin.getline(d,1000);

l1=strlen(c);l2=strlen(d);

for(i=0;i<l1;i++)

a[i]=c[l1-i-1]-'0';

for(i=0;i<l2;i++)

b[i]=d[l2-i-1]-'0';

if(l1>l2){k=l1;}else{k=l2;}

for(i=0;i<k;i++)

{

a[i]+=b[i];a[i+1]+=a[i]/10;a[i]%=10;

}

if(a[k]!=0) k++;

for(i=k-1;i>=0;i--)

{

a[i]+='0';

cout<<a[i];

}

cout<<endl;

system("pause");

}

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/1/31 14:46:22