zoukankan      html  css  js  c++  java
  • PAT (Advanced Level) Practice 1081 Rational Sum (20分) (注意精度问题!)

    1.题目

    Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum.

    Input Specification:

    Each input file contains one test case. Each case starts with a positive integer N (≤100), followed in the next line N rational numbers a1/b1 a2/b2 ... where all the numerators and denominators are in the range of long int. If there is a negative number, then the sign must appear in front of the numerator.

    Output Specification:

    For each test case, output the sum in the simplest form integer numerator/denominator where integer is the integer part of the sum, numerator < denominator, and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.

    Sample Input 1:

    5
    2/5 4/15 1/30 -2/60 8/3
    

    Sample Output 1:

    3 1/3
    

    Sample Input 2:

    2
    4/3 2/3
    

    Sample Output 2:

    2
    

    Sample Input 3:

    3
    1/3 -1/6 1/8
    

    Sample Output 3:

    7/24

    2.代码

    #include<iostream>
    #include<string>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    long long int a1, a2;
    long long int add1=0, add2=1;
    int gcd(long long int a, long long int b)
    {
    	return b == 0 ? a : gcd(b, a%b);
    }
    void output(long long int tempint, long long int tempa, long long int tempb)
    {
    	if (tempint == 0)
    	{
    		if (tempa > 0)printf("%lld/%lld", tempa, tempb);
    		else if (tempa == 0)printf("0");
    	}
    	else
    	{
    		if (tempa > 0)printf("%lld %lld/%lld", tempint, tempa, tempb);
    		else if (tempa == 0)printf("%lld", tempint);
    	}
    
    
    }
    int main()
    {
    	int n;
    	scanf("%d", &n);
    	for (int i = 0; i < n; i++)
    	{
    		scanf("%lld/%lld", &a1, &a2);
    		long long int d = gcd(a1, a2);
    		a1 = a1 / d;
    		a2 = a2 / d;
    		add1 = add1*a2 + add2*a1;
    		add2 = add2*a2;
    		d = gcd(add1, add2);
    		add1 = add1 / d;
    		add2 = add2 / d;
    	}
    	long long int inte = add1 / add2;
    	add1 = abs(add1);
    	add1 = add1 - inte*add2;
    	output(inte, add1, add2);
    	printf("
    ");
    }
    
  • 相关阅读:
    图解Go里面的互斥锁mutex了解编程语言核心实现源码
    day04 NTFS安全权限 | 文件共享服务器
    day03 用户与组管理 | 远程管理
    关于VMware的一些资源|IOS|序列号
    day03 批处理
    day02-IP地址详解
    test1
    simulink产生周期矩形波和8421码
    矩阵连乘问题的算法复杂度的计算--卡塔兰数(Catalan数)的数学推导和近似公式
    找出"吸血鬼数"(Java)
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788828.html
Copyright © 2011-2022 走看看