SSL JudgeOnline 2253——新型计算器

Description

  上次的评选活动杰杰帮了苗苗大忙,于是苗苗也参加了信息学奥赛小组,此事暂且不提,来说说数学。初一上学期主要学习有理数,每次的作业都是大量的分数计算题,苗苗都会算,就是嫌麻烦,目前的计算器又不能进行分数运算,于是她就想自己写一个计算器程序来实现分数的运算。该计算器能够进行分数的加、减、乘、除运算,并能将结果化为最简分数和带分数(设计出来可别被数学老师看到,否则要挨批评了,呵呵)。假设参加运算的分数都不是带分数(可以为假分数),并将整数看作分母为1的分数。

Input

输入文件computer.in共有三行,第一行为第一个分数的分子和分母,第二行为运算符,第三行为第二个分数的分子和分母;分子和分母都是正整数(小于等于32768)。确保数据有意义,并且最终结果为正数。

Output

以q/p的形式输出到输出文件computer.out中,其结果为最简分数;是假分数的还要化为带分数,先输出整数分数,再输出后面部分。

Sample Input

样例1
2 3
+
1 4

11/12

样例2

3 1

2 5

2 3/5

样例3
4 5
*
1 2

2/5

样例4
3 7
/
1 2

6/7


这题只用进行运算,然后将分数化简输出就得了。


代码如下:

var x,y,x1,x2,y1,y2,n:longint;
    f:char;

function pd(x,y:longint):longint;
var  i:longint;
begin
  for i:=x downto 2 do
    if (x mod i=0)and(y mod i=0) then exit(i);
  exit(0);
end;

function zx(x,y:longint):longint;
var n:longint;
begin
  if y>x then n:=y
         else n:=x;
  while (n mod y<>0)or(n mod x<>0) do inc(n);
  zx:=n;
end;

procedure doingc;
var t:longint;
begin
  t:=y1; y1:=y2; y2:=t;
  x:=y2*x2;
  y:=y1*x1;
end;

procedure doingch;
begin
  x:=y2*x2;
  y:=x1*y1;
end;

procedure doingj;
begin
  if x2<>y2 then begin x:=zx(x2,y2); y:=x div x2*x1-x div y2*y1; end
            else begin x:=y2; y:=x1-y1; end;

end;

procedure doingja;
begin
  if x2<>y2 then
    begin
      x:=zx(x2,y2);
      y:=x div x2*x1+x div y2*y1;
    end
  else begin x:=y2; y:=x1+y1; end;
end;

begin
  readln(x1,x2);
  readln(f);
  readln(y1,y2);
  case f of
    '+':doingja;
    '-':doingj;
    '*':doingch;
    '/':doingc;
  end;
  if y>x then write(y div x,' ');
  y:=y mod x;
  if y=0 then halt;
  n:=pd(x,y);
  if n=0 then write(y,'/',x)
         else write(y div n,'/',x div n);
end.
原文地址:https://www.cnblogs.com/Comfortable/p/8412458.html