洛谷2142 高精度减法 解题报告

it2026-08-17  7

洛谷2142 高精度减法

本题地址: http://www.luogu.org/problem/show?pid=2142

题目描述

高精度减法

输入输出格式

输入格式:

两个数(第二个可能比第一个大)

输出格式:

结果(是负数要输出负号)

输入输出样例

输入样例#1:

2 1

输出样例#1:

1

说明

题解

高精度

高精度减法须按照如下步骤进行。

1.输入和存储。

2.计算结果的位数和正负:位数不会超过两数中较大的一个,判断结果的正负可以根据被减数和减数的大小进行判断。

3.计算与错位处理。

4.处理结果的位数并输出结果。因为程序开始将结果的位数初始化为较大数的位数,实际中结果的位数可能达不到,因此要算出结果的实际位数。

下面附上代码。

代码

var i,l1,l2:longint;        a,b,c:array [1..502] of longint;        ch:array [1..502] of char;        fan:boolean;    begin     repeat//输入被减数,可以用array of char或ansistring储存      inc(l1);      read(ch[l1]);     until eoln;     for i:=to l1 do a[i]:=ord(ch[l1-i+1])-48;//转化为array of longint     readln;     repeat//对减数的处理同上      inc(l2);      read(ch[l2]);     until eoln;     for i:=to l2 do b[i]:=ord(ch[l2-i+1])-48;     if (l1<l2) or (l1=l2) and (a[1]<b[1]) then//特殊情况:当差为负数时      begin       fan:=true;//负数标记为真,供后期判断是否输出负号       //交换两个数,因为|a-b|=|b-a|,只需判断是否输出负号就行了       for i:=to l1 do c[i]:=a[i];       for i:=to l2 do a[i]:=b[i];       fillchar(b,sizeof(b),0);       for i:=to l1 do b[i]:=c[i];       l1:=l2;//减法运算执行Max(Len1,Len2)次,这里用L1储存      end;     for i:=to l1 do     begin      c[i]:=a[i]-b[i];      if (c[i]<0) and (i<l1) then//不是最高位时借位       begin        dec(a[i+1]);//注意这里要累减的不是c数组,应该是a数组        inc(c[i],10);       end;     end;     while c[l1]=do dec(l1);//找到最高的非0位     if l1<=then//当差为0时,直接输出并退出      begin       writeln(0);       halt;      end;     //输出差     if fan then write('-');     for i:=l1 downto do write(c[i]);    end.    

(本文系笔者原创,未经允许不得转载)

转载于:https://www.cnblogs.com/yzm10/p/4753324.html

相关资源:高精度减法(C++)
最新回复(0)