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.