首页 > 试题广场 >

有理数四则运算(20)

[编程题]有理数四则运算(20)
  • 热度指数:9970 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
本题要求编写程序,计算2个有理数的和、差、积、商。

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


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

输入

5/3 0/6

输出

1 2/3 + 0 = 1 2/3<br/>1 2/3 - 0 = 1 2/3<br/>1 2/3 * 0 = 0<br/>1 2/3 / 0 = Inf
推荐
啥头像
总体思路:
    模拟小学有理数的运算,注意约分和输出格式
注意点:
   所有输出均转换为真分式形式
   负号的位置,负号在括号内,不是在括号外。    (-1 1/3)
   整数部分为0时不输出整数部分,真分式部分为0时也不输出

代码如下:
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <sstream>

using namespace std;

long long greatestCommonDivisor(long long a, long long b);
string getProperFraction(long long num, long long den);

int main()
{
    // 提取分数的两部分
    string fraction1, fraction2;
    cin >> fraction1 >> fraction2;
    long long num1, den1, num2, den2;
    int nPos = fraction1.find('/');
    num1 = atoi((fraction1.substr(0, nPos)).c_str());
    den1 = atoi((fraction1.substr(nPos+1)).c_str());
    nPos = fraction2.find('/');
    num2 = atoi((fraction2.substr(0, nPos)).c_str());
    den2 = atoi((fraction2.substr(nPos+1)).c_str());

    // 四则运算
    string first = getProperFraction(num1, den1);
    string second = getProperFraction(num2, den2);
        // +
    long long num = num1*den2 + num2*den1;
    long long den = den1*den2;
    string third = getProperFraction(num, den);
    cout << first << " + " << second << " = " << third << endl;
        // -
    num = num1*den2 - num2*den1;
    third = getProperFraction(num, den);
    cout << first << " - " << second << " = " << third << endl;
        // *
    num = num1*num2; den = den1*den2;
    third = getProperFraction(num, den);
    cout << first << " * " << second << " = " << third << endl;
        // /
    num = num1*den2; den = den1*num2;
    if(den == 0) {
        cout << first << " / " << second << " = Inf" << endl;
    } else {
        third = getProperFraction(num, den);
        cout << first << " / " << second << " = " << third << endl;
    }

    return 0;
}

string getProperFraction(long long num, long long den)
{
    // 基本边界、基本变量
    if(num == 0) {
        return "0";
    }
    bool isMinus = false;
    string str = "";
    if(num*den < 0) {
        isMinus = true; num = abs(num);
        den = abs(den); str = "(-";
    }

    //约分
    long long gcd = greatestCommonDivisor(num, den);
    num /= gcd; den /= gcd;
    stringstream ss; ss << (num/den);
    string intPart, fracPart;
    ss >> intPart;
    stringstream ss2; ss2 << (num%den);
    ss2 >> fracPart;
    if((num/den)>0) {
        str += intPart;
    }
    if((num%den)>0) {
        if((num/den)>0) {
            str += " ";
        }
        str += fracPart; str += '/';
        stringstream ss3; string temp;
        ss3 << den; ss3 >> temp;
        str += temp;
    }
    if(isMinus) {
        str += ')';
    }
    return str;
}

long long greatestCommonDivisor(long long a, long long b)
{
    long long c;
    while (b != 0) {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
} 


编辑于 2016-04-12 22:55:21 回复(1)
感觉我肯定很多多余的代码。。不过好歹是做出来了
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner keyin = new Scanner(System.in);
        String str = keyin.nextLine();
        String[] strs = str.split(" ");
        String[] a1b1 = strs[0].split("/");
        String[] a2b2 = strs[1].split("/");
        int a1 = Integer.valueOf(a1b1[0]);
        int b1 = Integer.valueOf(a1b1[1]);
        int a2 = Integer.valueOf(a2b2[0]);
        int b2 = Integer.valueOf(a2b2[1]);
        String add = exchange((a1*b2+a2*b1),(b1*b2));
        String sub = exchange((a1*b2-a2*b1),(b1*b2));
        String mult = exchange((a1*a2),(b1*b2));
        String div = exchange((a1*b2),(a2*b1));
        String ONE = exchange(a1,b1);
        String TWO = exchange(a2,b2);
        System.out.println(ONE+" + "+TWO+" = "+add);
        System.out.println(ONE+" - "+TWO+" = "+sub);
        System.out.println(ONE+" * "+TWO+" = "+mult);
        System.out.println(ONE+" / "+TWO+" = "+div);
    }
    public static String exchange(Integer a,Integer b){
        String abs ;
        if (b==0){
            return "Inf" ;
        }
        if (a/b==0&&a%b==0){
            return "0";
        }
        if (a/b==0){
            abs = "";
        }else {
            abs = Math.abs(a/b)+"";
        }
        String mod ;
        if (a%b==0) {
            mod = "";
        }else if (a/b==0) {
            mod = divise(Math.abs(a%b),Math.abs(b));
        }else {
            mod = " "+divise(Math.abs(a%b),Math.abs(b));
        }
        if (a<0||b<0){
            return "(-"+abs+mod+")";
        }else if (a/b>0){
            return a/b+mod;
        }else {
            return mod;
        }
    }
    public static String divise(Integer a,Integer b){
        int ab = a>b? b : a;
        int divisor =1;
        for (int i = 1;i<=ab;i++){
            if (a%i==0&&b%i==0){
                divisor=i;
            }
        }
        if (divisor==b){
            return a/divisor+"";
        }
        return a/divisor+"/"+b/divisor;
    }
}


编辑于 2020-02-09 16:48:27 回复(0)
最讨厌这种模拟题了,代码冗长冗长的,也不想优化了,过了就行。😫
import java.util.*;

public class Main{
    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        String[] s1 = sc.next().split("/");
        String[] s2 = sc.next().split("/");
        int [] a = {Integer.parseInt(s1[0]), Integer.parseInt(s1[1])};
        int [] b = {Integer.parseInt(s2[0]), Integer.parseInt(s2[1])};
        yueFen(a);
        yueFen(b);
        int [] he = he(a, b);
        int [] cha = cha(a, b);
        int [] ji = ji(a, b);
        int [] shang = shang(a, b); 
        yueFen(a);
        yueFen(b);
        yueFen(he);
        yueFen(cha);
        yueFen(ji);
        yueFen(shang);
        int [] ha = handle(a);
        int [] hb = handle(b);
        int [] hhe = handle(he);
        int [] hcha = handle(cha);
        int [] hji = handle(ji);
        int [] hshang = handle(shang);       
        String str1 = exchange(ha);
        String str2 = exchange(hb);
        System.out.println(str1 + " + " + str2 + " = " + exchange(hhe));
        System.out.println(str1 + " - " + str2 + " = " + exchange(hcha));
        if(str2.length() == 1 && str2.equals("0")){
        	System.out.println(str1 + " * " + str2 + " = " + "0");
        	System.out.println(str1 + " / " + str2 + " = " + "Inf");
        }else {
        	System.out.println(str1 + " * " + str2 + " = " + exchange(hji));
        	System.out.println(str1 + " / " + str2 + " = " + exchange(hshang));
        }
    }
	private static String exchange(int[] a) {
		String s = "";
		if(a[1] == 1 && a[2] == 1)return "1";
		if(a[1] == 0 ){
			if(a[0] == 0)return "0";
			s += a[0];
			if(a[0] < 0) s = "(" + s + ")";
			return s;
		}
		if(a[0] != 0) s += Math.abs(a[0]) + " ";
		s += Math.abs(a[1]) + "/" + Math.abs(a[2]);
		if(a[0] < 0 || a[1] < 0 || a[2] < 0){
			s = "(-" + s + ")";
		}
		return s;
	}
	private static int[] handle(int[] a) {
		int [] ha = {0, a[0], a[1]};
		if(Math.abs(a[0]) > Math.abs(a[1])){
			ha[0] = a[0] / a[1];
			ha[1] = a[0] % a[1];
		}
		return ha;
	}
	private static int[] shang(int[] a, int[] b) {
		int [] res = {0, 0};
		if(a[0] == 0) return res;
		res[0] = a[0] * b[1];
		res[1] = a[1] * b[0];
 		return res;
	}
    private static int[] ji(int[] a, int[] b) {
		int [] res = {0, 0};
		if(a[0] == 0 || b[0] ==0) return res;
		res[0] = a[0] * b[0];
		res[1] = a[1] * b[1];
		return res;
	}
	private static int[] cha(int[] a, int[] b) {
		int [] res = {0, 0};
		if(a[0] == 0 ){
			res[0] = -1 * b[0];
			res[1] = b[1];
			return res;
		}
		if(b[0] == 0)return a;
		res[0] = a[0] - b[0];
		res[1] = a[1];
		return res;
	}
	private static int[] he(int[] a, int[] b) {
		int [] res = {0, 0};
		if(a[0] == 0 )return b;
		if(b[0] == 0)return a;
		int k = 0;
		if(a[1] != b[1]){
			k = a[1];
			a[1] *= b[1];
			a[0] *= b[1];
			b[1] = a[1];
			b[0] *= k;
		}
		res[0] = a[0] + b[0];
		res[1] = a[1];
		return res;
	}
	private static void yueFen(int[] arr) {
		if(arr[0] == 0){
			arr[1] = 0;
			return ;
		}
		if(arr[0] == arr[1]){ 
			arr[0] = arr[1] = 1;
			return ;
		}
		int i = 2;
		while(i <= Math.abs(arr[0])){
			if(arr[0] % i == 0 && arr[1] % i == 0){
				arr[0] /= i;
				arr[1] /= i;
				i = 1;
			}
			i++;
		}
	}
}

发表于 2019-08-20 20:35:01 回复(2)
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String sc1 = sc.next();
        String sc2 = sc.next();

        sc.close();

        int divisor;
        int[] answer = new int[4];
        int[] a = StringToIntArray(sc1), b = StringToIntArray(sc2);
        divisor = getDivisor(a[0], a[1]);
        a[0] /= divisor; a[1] /= divisor;
        divisor = getDivisor(b[0], b[1]);
        b[0] /= divisor; b[1] /= divisor;
        int[] printA = new int[4], printB = new int[4];
        printA[2] = a[0]; printA[3] = a[1];
        printB[2] = b[0]; printB[3] = b[1];
        change(printA); change(printB);


        //加法
        answer[2] = a[0] * b[1] + b[0] * a[1];
        answer[3] = a[1] * b[1];
        divisor = getDivisor(answer[2], answer[3]);
        answer[2] /= divisor; answer[3] /= divisor;
        change(answer);
        System.out.println(printNum(printA) + " + " + printNum(printB) + " = " + printNum(answer));
        //减法
        answer[2] = a[0] * b[1] - b[0] * a[1];
        answer[3] = a[1] * b[1];
        divisor = getDivisor(answer[2], answer[3]);
        answer[2] /= divisor; answer[3] /= divisor;
        change(answer);
        System.out.println(printNum(printA) + " - " + printNum(printB) + " = " + printNum(answer));
        //乘法
        answer[2] = a[0] * b[0];
        answer[3] = a[1] * b[1];
        divisor = getDivisor(answer[2], answer[3]);
        answer[2] /= divisor; answer[3] /= divisor;
        change(answer);
        System.out.println(printNum(printA) + " * " + printNum(printB) + " = " + printNum(answer));
        //除法
        if (b[0] != 0) {
            if (b[0] < 0) {
                b[1] = -b[1];
                b[0] = -b[0];
            }
            answer[2] = a[0] * b[1];
            answer[3] = a[1] * b[0];
            divisor = getDivisor(answer[2], answer[3]);
            answer[2] /= divisor; answer[3] /= divisor;
            change(answer);
            System.out.println(printNum(printA) + " / " + printNum(printB) + " = " + printNum(answer));
        } else {
            System.out.println(printNum(printA) + " / " + printNum(printB) + " = Inf");
        }
    }

    //获得最简分数
    public static void change (int num[]) {
        if (num[2] < 0) {
            num[0] = 1;
            num[2] = - num[2];
        } else {
            num[0] = 0;
        }
        num[1] = num[2] / num[3];
        num[2] = num[2] % num[3];
    }

    //字符串转数组
    public static int[] StringToIntArray (String str) {
        int[] num = new int[2];
        String[] strArray = str.split("/");
        num[0] = Integer.valueOf(strArray[0]);
        num[1] = Integer.valueOf(strArray[1]);
        return num;
    }

    //获得最大公因数
    public static int getDivisor (int a, int b) {
        if (a < 0) {
            a = -a;
        }
        if (b < 0) {
            b = -b;
        }
        while(a % b != 0){
            int temp = a % b;
            a = b;
            b = temp;
        }
        return b;//最大公因数
    }

    //获得数字对应的字符串
    public static String printNum (int[] answer) {
        StringBuffer a = new StringBuffer();
        if (answer[2] != 0) {
            if (answer[0] == 1) {
                a.append("(-" + (answer[1] != 0 ? answer[1] + " " : "") + answer[2] + "/" + answer[3] + ")");
            } else {
                a.append((answer[1] != 0 ? answer[1] + " " : "") + answer[2] + "/" + answer[3]);
            }
        } else if (answer[1] != 0) {
            if (answer[0] == 1) {
                a.append("(-" + (answer[1] != 0 ? answer[1]: "") + ")");
            } else {
                a.append((answer[1] != 0 ? answer[1] : ""));
            }
        } else {
            a.append(0);
        }
        return a.toString();
    }
}

编辑于 2018-12-05 17:25:46 回复(0)

import java.util.Scanner;
public class Pat_1024 {  private int[] Data; //保存分子和分母  private String[] result; //保存结果    public Pat_1024() {   result = new String[4];   //获得数据   Scanner sc = new Scanner(System.in);   String str = sc.nextLine();   str = str.replace(" ","/");    //注意该方法不是返回自身,所以需要更新引用   String[] temp = str.split("/");   sc.close();   Data = new int[temp.length];   for(int i=0;i<temp.length;i++) {    Data[i] = Integer.parseInt(temp[i]);   }  }  public static void main(String[] args) {   Pat_1024 main = new Pat_1024();   main.calculate();   main.printReslt();  }  /**   * 输出方法:输出四则运算表达式及结果   */  public void printReslt() {   System.out.println(getSimple(Data[0], Data[1])+" + "+getSimple(Data[2], Data[3])+" = "+result[0]);   System.out.println(getSimple(Data[0], Data[1])+" - "+getSimple(Data[2], Data[3])+" = "+result[1]);   System.out.println(getSimple(Data[0], Data[1])+" * "+getSimple(Data[2], Data[3])+" = "+result[2]);   System.out.println(getSimple(Data[0], Data[1])+" / "+getSimple(Data[2], Data[3])+" = "+result[3]);  }  /**   * 计算:计算四则运算的结果并存储   */  public  void calculate() {   result[0] = getSimple(Data[0]*Data[3]+Data[2]*Data[1], Data[1]*Data[3]);   result[1] = getSimple(Data[0]*Data[3]-Data[2]*Data[1], Data[1]*Data[3]);   result[2] = getSimple(Data[0]*Data[2], Data[1]*Data[3]);   result[3] = getSimple(Data[0]*Data[3], Data[1]*Data[2]);  }  /**   * 将数据化为最简   * @param num1分子   * @param num2分母   */  public String getSimple(int num1,int num2) {   boolean flag = false;//标记结果的正负   String resultTemp = ""; //保存化简后的结果   int i;          //保存整数部分   int temp ;  //最大公约数   if(num1<0 && num2<0) {  //分子分母同为负    num1 = Math.abs(num1);    num2 = Math.abs(num2);   }   else {    if(num1<0 || num2<0) {//分子分母其一为负     flag = true;     num1 = Math.abs(num1);     num2 = Math.abs(num2);    }   }   //特殊情况   if(num2==0) {    return "Inf";   }   if(num1==0) {    return "0";   }   //将分子和分母的最大公约数除去   temp = Math.min(num1, num2);   for(;temp>1;temp--) {    if(num1%temp==0 && num2%temp==0) {     num1 /= temp;     num2 /= temp;     break;    }   }   //假分数化为真分数   if(num1>num2) {    if(num2==1) //结果为整数     resultTemp = ""+num1;    else {     i = num1/num2;     num1 -= i*num2;     resultTemp = i+" "+num1+"/"+num2;    }   }else {    if(num1==num2) //结果为1     resultTemp = "1";    else {  //本身就是真分数     resultTemp = num1+"/"+num2;    }   }   if(flag) { //改变结果的正负    resultTemp = "(-"+resultTemp+")";   }   return resultTemp;  } }
发表于 2018-03-16 11:27:30 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
     
    private static String euclideanFunction(int numerator, int denominator) {
        int a = numerator;
        int b = denominator;
         
        boolean negative = false;
         
        boolean hasInteger = false;
         
        //去除负号
        if(a < 0 && b < 0) {
            a -= 2 * a;
            b -= 2 * b;
        }else if(a < 0) {
            negative = true;
            a -= 2 * a;
        }else if(b < 0) {
            negative = true;
            b -= 2 * b;
        }
         
        String result = "";
         
        if(b == 0) {
            result = "Inf";
        }else if(a == 0) {
            result = "0";
        }else {
            int c = 0;
            //求最大公约数
            while((a % b) != 0) {
                c = a % b;
                a = b;
                b = c;
            }

            //数字不能化作整数则进行约分
            if(c != 0) {
                a = numerator;
                b = denominator;
                 
                //去除负号
                if(a < 0 && b < 0) {
                    a -= 2 * a;
                    b -= 2 * b;
                }else if(a < 0) {
                    a -= 2 * a;
                }else if(b < 0) {
                    b -= 2 * b;
                }
                 
                a /= c;
                b /= c;
            }
             
            if(negative) {
                result += "(-";
            }
            //整数部分
            if((a / b) > 0) {
                result += (a / b);
                hasInteger = true;
            }
            //分数部分
            if((a % b) > 0) {
                if(hasInteger) {
                    result += " ";
                }
                result += (a % b) + "/" + b;
            }
             
            if(negative) {
                result += ")";
            }
        }
        return result;
    }
     
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
 
        String[] numbers = bufferedReader.readLine().split(" ");
        String[] number1 = numbers[0].split("/");
        String[] number2 = numbers[1].split("/");
         
        int a1 = Integer.parseInt(number1[0]);
        int a2 = Integer.parseInt(number1[1]);
         
        int b1 = Integer.parseInt(number2[0]);
        int b2 = Integer.parseInt(number2[1]);
         
        String simpleNumber1 = euclideanFunction(a1, a2);
        String simpleNumber2 = euclideanFunction(b1, b2);
         
        System.out.println(simpleNumber1 + " + " + simpleNumber2 +
                " = " + euclideanFunction(a1 * b2 + a2 * b1, a2 * b2));
        System.out.println(simpleNumber1 + " - " + simpleNumber2 +
                " = " + euclideanFunction(a1 * b2 - a2 * b1, a2 * b2));
        System.out.println(simpleNumber1 + " * " + simpleNumber2 +
                " = " + euclideanFunction(a1 * b1, a2 * b2));
        System.out.println(simpleNumber1 + " / " + simpleNumber2 +
                " = " + euclideanFunction(a1 * b2, a2 * b1));
    }
}

编辑于 2017-11-22 17:37:23 回复(0)