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("
    ");
    }
    
  • 相关阅读:
    linux添加到普通用户sudo才干
    跳跃Java一些周期,双跳FOR周期
    Android虚拟机器学习总结Dalvik虚拟机创建进程和线程分析
    Notes系统安全日志
    android Intent.createChooser 应用选择
    创业这么难,去哪儿?
    视频和音频播放的演示最简单的例子6:OpenGL广播YUV420P(T经exture,采用Shader)
    名单(两)——基本操作单向链表(创、删、印、节点统计数)
    JS列
    第38周三
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788828.html
Copyright © 2011-2022 走看看