词条 | 高精度减法 |
释义 | 高精度减法 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。