洛谷2142 高精度减法 解题报告
2015-08-23 22:09
274 查看
洛谷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:=1 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:=1 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:=1 to l1 do c[i]:=a[i];
for i:=1 to l2 do a[i]:=b[i];
fillchar(b,sizeof(b),0);
for i:=1 to l1 do b[i]:=c[i];
l1:=l2;//减法运算执行Max(Len1,Len2)次,这里用L1储存
end;
for i:=1 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]=0 do dec(l1);//找到最高的非0位
if l1<=0 then//当差为0时,直接输出并退出
begin
writeln(0);
halt;
end;
//输出差
if fan then write('-');
for i:=l1 downto 1 do write(c[i]);
end.
(本文系笔者原创,未经允许不得转载)
相关文章推荐
- UIButton总结
- Place the Robots
- c++面试笔试必备知识
- Java多线程编程-同步代码块
- Servlet的线程安全问题
- MySQL中/*!代码 ……*/的使用
- UIlable总结
- vim IDE平台-打造属于自己的配置
- 黑马程序员—学习笔记—接口
- <<如何阅读一本书>>经典摘抄1
- Android xml实现Button背景图片
- Dijkstra算法
- 用两个栈实现一个队列
- bootstrap
- JavaSE复习日记 : 实例化对象/构造方法和this关键字
- iOS中加速度传感器的使用
- mvn学习
- 用 ObjectMapper将JSON字符串转换为java对象时,java对象一定要有无参构造函数
- WedDriver中 如何处理table
- [Android ] 多线程操作中更新UI控件的方法