1034. 有理数四则运算

来源:互联网 发布:江苏凤凰数据有限公司 编辑:程序博客网 时间:2024/06/05 00:11

原题描述:

本题要求编写程序,计算2个有理数的和、差、积、商。

输入格式:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。

输出格式:

分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。

输入样例1:
2/3 -4/2
输出样例1:
2/3 + (-2) = (-1 1/3)2/3 - (-2) = 2 2/32/3 * (-2) = (-1 1/3)2/3 / (-2) = (-1/3)
输入样例2:
5/3 0/6
输出样例2:
1 2/3 + 0 = 1 2/31 2/3 - 0 = 1 2/31 2/3 * 0 = 01 2/3 / 0 = Inf

思路 

这道题的注意点就是分数的约分和表示。

1.题目限定了输入输出都不超过整型范围,当我们计算两个分数的加减乘除时,分子分母就应该不超过长整形范围

2.判断输出的正负号
3.三种输出形式

代码
#include <stdio.h>long GCD( long a , long b ){    long r = 0 ;    while ( r = a % b )    {            a = b ;            b = r ;    }    return b;}void frac( long n , long d ){    //判断分母是否为0    if ( d == 0 )    {        printf("Inf");        return ;    }    //判断符号    int inegative = 1 ;    if ( n < 0 )    {        n = -n ;        inegative *= -1;               //通过两者之积的方式来判断输出的正负情况    }    if ( d < 0 )    {        d = -d;        inegative *= -1;    }    long gcd = GCD ( n , d );            //gcd为整数部分    n /= gcd;                            //最简值下的分母    d /= gcd;                            //最简值下的分子    if ( inegative == -1 )   printf("(-");    if ( n / d && n % d )    printf("%ld %ld/%ld",n/d, n%d, d );            //假分数    else if ( n % d )        printf("%ld/%ld",n%d, d );                     //分数    else                     printf("%ld",n/d);                             //整数    if ( inegative == -1 )   printf(")");}int main ( ){    long a1, b1, a2, b2 ;    int i ;    scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2) ;    char op [ 4 ] = { '+', '-', '*' , '/' } ;    for ( i = 0 ; i < 4 ; i ++ )    {        frac( a1, b1 );        printf(" %c ",op[ i ] );        frac( a2, b2 );        printf(" = ");        switch( op [ i ] )        {            case '+' : frac ( a1 * b2 + a2 * b1, b1 * b2 );          break ;            case '-'  : frac ( a1 * b2 - a2 * b1 , b1 * b2 );        break ;            case '*'  : frac ( a1 * a2 , b1 * b2 );                  break ;            case '/'  : frac ( a1 * b2 , b1 * a2 );                  break ;        }        printf("\n");    }    return 0 ;}

原文链接见:http://www.jianshu.com/p/5303f2431f05


原创粉丝点击