1076有理数运算 解题报告



                                            有理数运算

时间限制(普通/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的。。。但是把它弄出来写解题报告是因为想记住点东西。。就是思路要清晰。。。在不影响素的和内存的情况下,定义一些自定义函数都是好的。。可以让程序变得好看点。。。

不要所有操作都在主函数里完成,主函数只充当一个表示逻辑顺序的过程。。。好像就没什么想写的了。。。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值