[PAT (Advanced Level) ]1081. Rational Sum 解题文档

1081. Rational Sum (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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

分析:
(1)输入数据时,以字符串读入;
(2)以“/”进行分割处理,计算;
(3)GCD算法进行化简,GCD算法,是用来求解最大公约数的算法,也称为欧几里得算法;
(4)按照输出要求对结果进行处理。
需要注意的例子有:0/0,1/0,0/1

贴上C++代码如下。
#include<iostream>
#include<string>
#include<strstream>
#include<vector>
using namespace std;

int N;
int gcd(int a,int b){//the gcd of a1 and a2
    if(a*b==0) return 1;
    bool flag=true;
    while(flag){
        if(a>b){
            a=a-b;
        }
        else if(a<b){
            b=b-a;
        }
        else if(a==b){
            break;
        }
    }
    return a;
}


string add(string a1,string a2){
    int numerator[2];
    int denominator[2];
    for(int i=0;i<a1.size();i++){
        if(a1[i]=='/'){
            numerator[0]=atoi(a1.substr(0,i).c_str());
            denominator[0]=atoi(a1.substr(i+1,(int)a1.size()-1-i).c_str());
        }
    }
    for(int i=0;i<a2.size();i++){
        if(a2[i]=='/'){
            numerator[1]=atoi(a2.substr(0,i).c_str());
            denominator[1]=atoi(a2.substr(i+1,(int)a2.size()-1-i).c_str());
        }
    }
//    cout<<numerator[0]<<"  "<<denominator[0]<<endl;
//    cout<<numerator[1]<<"  "<<denominator[1]<<endl;
//    if(denominator[0]*denominator[1])
    int numeratorS=numerator[0]*denominator[1]+numerator[1]*denominator[0];
    int denominatorS=denominator[0]*denominator[1];
    for(int i=0;i<2;i++){
    if(denominator[i]==0){
        denominator[i]=1;
        numerator[i]=0;
        }
    }
    int GCD=gcd(numeratorS,denominatorS);
   // cout<<"www  "<<GCD;
    numeratorS=numeratorS/GCD;
    denominatorS=denominatorS/GCD;
    string result;
    strstream ss;
    ss<<numeratorS;
    ss>>result;
    result+="/";
    ss.clear();//clear
    ss<<denominatorS;
    string temps;
    ss>>temps;
    result+=temps;
    return result;
}

vector<string> res(string a1){
    vector<string> vec;
    int numerator=0;
    int denominator=0;
    for(int i=0;i<a1.size();i++){
        if(a1[i]=='/'){
            numerator=atoi(a1.substr(0,i).c_str());
            denominator=atoi(a1.substr(i+1,(int)a1.size()-1-i).c_str());
        }
    }
    if(numerator*denominator==0){
        vec.push_back("0");
        return vec;
    }
    if(numerator%denominator==0){
        int res=numerator/denominator;
        strstream ss;
        ss<<res;
        string temp;
        ss>>temp;
        vec.push_back(temp);
        return vec;
    }
    else if(numerator>denominator){
        int res=numerator/denominator;
        strstream ss;
        ss<<res;
        string temp;
        ss>>temp;
        vec.push_back(temp);
        temp="";
        string temp1;
        ss.clear();
        res=numerator%denominator;
        ss<<res;
        ss>>temp1;
        temp+=temp1;
        temp+="/";
        
        ss.clear();
        ss<<denominator;
        ss>>temp1;
        temp+=temp1;
        vec.push_back(temp);
        return vec;
    }
    else {
        vec.push_back(a1);
    }
    return vec;
}

int main(){
    cin>>N;
    string s="0/1";
    for(int i=0;i<N;i++){
        string aaa;
        cin>>aaa;
        s=add(s,aaa);
    }
    vector<string> v=res(s);
    for(int i=0;i<v.size()-1;i++){
        cout<<v[i]<<" ";
    }
    cout<<v[v.size()-1];
    
    return 0;
}

所有测试点均通过。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值