#P1396. Simple Arithmetics

    ID: 397 传统题 文件IO:poj 1000ms 10MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>模拟高精度Central Europe 2000

Simple Arithmetics

题目描述

WAP门户的新功能之一是计算器,用于计算包含超长数字的表达式。为了使输出更加美观,结果会按照手动计算的常见格式进行格式化。

你的任务是编写这个计算器的核心部分。给定两个数字和请求的操作,你需要计算结果并按照以下指定的格式打印。对于加法和减法,数字需要垂直对齐书写。乘法的处理稍微复杂一些:首先,我们需要为第二个数字的每一位计算部分积,然后将这些部分积相加得到最终结果。

输入格式

第一行输入包含一个正整数T,表示接下来的表达式数量。每个表达式占一行,包含一个正整数、一个操作符(+、-或*)和第二个正整数。每个数字最多有500位。行内没有空格。如果是减法操作,第二个数字总是小于第一个数字。所有数字都不会以零开头。

输出格式

对于每个表达式,打印两行分别显示两个数字,第二个数字位于第一个数字下方,且它们的最后一位(个位数)必须对齐在同一列。操作符应紧贴在第二个数字的第一个数字之前。在第二个数字之后,必须有一行由短横线(-)组成的水平线。

对于加法或减法,结果应位于水平线下方,且最后一位与两个操作数的最后一位对齐。

对于乘法,将第一个数字与第二个数字的每一位相乘。将部分积依次排列在下方,从第二个数字的最后一位开始计算。每个部分积应与对应的数字对齐,即部分积的最后一位必须与第二个数字的对应位在同一列。部分积不能以额外的零开头。如果某一位是零,则部分积必须是一个零。如果第二个数字的位数超过一位,则在部分积下方再画一条水平线,然后打印它们的总和。

每行的开头空格数应尽可能少,同时满足其他约束条件。水平线的长度必须恰好覆盖上方和下方两行数字(和操作符)的最左和最右位置。也就是说,水平线的起始列是上方和下方两行中最左的数字或操作符所在的列,结束列是这两行中最右的数字所在的列。水平线既不能更长也不能更短。

每个测试用例之后输出一个空行,包括最后一个测试用例。

示例输入1

4
12345+67890
324-111
325*4405
1234*4

示例输出1

 12345 
+67890 
------ 
 80235 

 324 
-111 
----
 213 

    325 
  *4405 
  ----- 
   1625 
     0 
 1300 
1300 
------- 
1431625 

1234 
  *4 
---- 
4936 

来源

Central Europe 2000