• 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("
    ");
    }
    
  • 相关阅读:
    PHPStrom 转 VSCode 折腾记录
    vscode php 代码提示 自动完成
    Elasticsearch中文分词加拼音
    AutoMapper用法
    删除所有退出状态的容器
    Linux 安装Docker
    千里眼的修练方法--末法时代即将结束
    Visual NMP
    c#通过反射获取类上的自定义特性
    微信小程序学习笔记
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788828.html
Copyright © 2020-2023  润新知