有理数运算
时间限制(普通/Java):1000MS/5000MS 运行内存限制:65536KByte
描述
任何有理数都可以表示成为两个整数的比。两个有理数加、减、乘、除运算的结果仍然是有理数(除数的值为0除外)。本题要求你实现有理数的加减乘除运算。有理数的主体是两个正整数的比,前面是一个正负号(正号必须省略不写)。有理数可以按照如下规定规约:(1)任何整数n都表示成为n/1的形式;(2)有理数的最终输出形式必须是约分之后的,例如,输出-15/10是非法的,但输出-3/2就是合法的。如果结果是0或-0,则其标准形式是0/1。
输入
第一行是一个整数n,在[2,10000]之间,表示要输入的案例的数量。后面紧跟n行,每一个案例占一行输入,是操作符两端各有一个有理数的形式,有理数的分子和分母都是[0, 10000]之中的数。操作符包括加(+)、减(-)、乘(*)、除(/)。有理数和操作符之间、以及操作符和有理数之间必须有且仅有一个空格。输入中保证不存在非法的形式,但有可能是不简约的形式,例如可能存在-9/15,而不是-3/5;可能是0/7,而不是0/1
输出
对每一个案例,用一行输出其算术运算结果。如果出现了分母为0的情况,直接输出ILLEGAL。对于非ILLEGAL的结果,必须是简约的最终形式。例如,0必须写成0/1,-3/3必须写成-1/1, -0/7必须写成0/1。
样例输入
8
-2/3 + -1/3
9/15 + 4/5
3/4 / -0/7
2/0 + -1/9
15/1 - 1/15
25/125 / -1/1
49/1 / 7/1
-2/5 - -6/10
样例输出
-1/1
7/5
ILLEGAL
ILLEGAL
224/15
-1/5
7/1
1/5
代码:
#include<stdio.h>
int c,C;
int add(int a,int A,int b,int B)
{
int f;
f=1;
c=a*B+A*b;
C=A*B;
if((A==0)||(B==0))
f=0;
return f;
}
int less(int a,int A,int b,int B)
{
int f;
f=1;
c=a*B-A*b;
C=A*B;
if((A==0)||(B==0))
f=0;
return f;
}
int mult(int a,int A,int b,int B)
{
int f;
f=1;
c=a*b;
C=A*B;
if((A==0)||(B==0))
f=0;
return f;
}
int exce(int a,int A,int b,int B)
{
int f;
f=1;
c=a*B;
C=A*b;
if((A==0)||(b==0))
f=0;
return f;
}
void Abo(int x,int y)
{
int a=x,b=y,t,q;
if(a<b)
{
t=a;
a=b;
b=t;
}
while(b!=0)
{
q=a%b;
a=b;
b=q;
}
c=x/a;
C=y/a;
}
int main()
{
int n,a,A,b,B,F;char o;
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
scanf("%d/%d %c %d/%d",&a,&A,&o,&b,&B);
if(o=='+')
{
F=add(a,A,b,B);
if(F==0)
{
printf("ILLEGAL\n");
continue;
}
}
if(o=='-')
{
F=less(a,A,b,B);
if(F==0)
{
printf("ILLEGAL\n");
continue;
}
}
if(o=='*')
{
F=mult(a,A,b,B);
if(F==0)
{
printf("ILLEGAL\n");
continue;
}
}
if(o=='/')
{
F=exce(a,A,b,B);
if(F==0)
{
printf("ILLEGAL\n");
continue;
}
}
if(c==0)
printf("0/1\n");
else
{
if((c<0)&&(C<0))
Abo(-c,-C);
if((c<0)&&(C>0))
{
Abo(-c,C);
c=-c;
}
if((c>0)&&(C<0))
{
Abo(c,-C);
c=-c;
}
if((c>0)&&(C>0))
Abo(c,C);
printf("%d/%d\n",c,C);
}
}
}
return 0;
}
总结:这道题是一遍a的。。。但是把它弄出来写解题报告是因为想记住点东西。。就是思路要清晰。。。在不影响素的和内存的情况下,定义一些自定义函数都是好的。。可以让程序变得好看点。。。
不要所有操作都在主函数里完成,主函数只充当一个表示逻辑顺序的过程。。。好像就没什么想写的了。。。