分数加减法

Problem Description

编写一个C程序,实现两个分数的加减法

Input

输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。

其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。

数据以EOF结束
输入数据保证合法
 

Output

对于输入数据的每一行输出两个分数的运算结果。
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数

Sample Input

1/8+3/8
1/4-1/2
1/3-1/3

Sample Output

1/2
-1/4
0

Hint

Source

AC代码:

import java.util.Scanner;
class C{
    int z;
    int m;
    public C(int z, int m) {
        super();
        this.z = z;
        this.m = m;
    }
    public int gcd(int a,int b){///求最大公约数。
        while(b>0)
        {
            int r = a%b;
            a = b;
            b = r;
        }
        return a;
    }
    public void add(C c){///通分。
        //System.out.println("2");
        int gcd = gcd(Math.abs(c.m),Math.abs(this.m));
        int lcm = (c.m*this.m)/gcd;
        int nz1 = lcm/this.m*this.z;
        int nz2 = lcm/c.m*c.z;
        int res = nz1+nz2;
        int gcd1 = gcd(Math.abs(res),Math.abs(lcm));
        this.z = res/gcd1;
        this.m = lcm/gcd1;
    }
    public void sub(C c){
        //System.out.println("2");
        int gcd = gcd(Math.abs(c.m),Math.abs(this.m));
        int lcm = (c.m*this.m)/gcd;
        int nz1 = lcm/this.m*this.z;
        int nz2 = lcm/c.m*c.z;
        int res = nz1-nz2;
        int gcd1 = gcd(Math.abs(res),Math.abs(lcm));
        this.z = res/gcd1;
        this.m = lcm/gcd1;
    }
    @Override
    public String toString() {///注意是三种情况。
        if(this.z==0)
            return 0+"";
        else if(this.m==1)
            return this.z+"";
        else return this.z+"/"+this.m;
    }
    
}
public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        while(reader.hasNext())
        {
            String str = reader.next();
            String[] st = str.split("\\d+");///按照多个数字字符分割。
            String[] ch = str.split("\\D+");///按照多个非数字字符分割。
            int a = Integer.parseInt(ch[0]);
            int b = Integer.parseInt(ch[1]);
            int c = Integer.parseInt(ch[2]);
            int d = Integer.parseInt(ch[3]);
            C c1 = new C(a,b);
            C c2 = new C(c,d);
            if(st[2].equals("+"))///st[0]是' ';
            {
                //System.out.println("1");
                c1.add(c2);
            }
            else
            {
                //System.out.println("1");
                c1.sub(c2);
            }
            System.out.println(c1);
        }
        reader.close();
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值