1034. 有理数四则运算(20)

来源:互联网 发布:17年淘宝生意越来越差 编辑:程序博客网 时间:2024/05/19 03:23

1034. 有理数四则运算(20)
本题要求编写程序,计算2个有理数的和、差、积、商。

输入格式:

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

输出格式:

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

2/3 -4/2

输出样例1:

2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

输入样例2:

5/3 0/6

输出样例2:

1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

#include<iostream>#include<fstream>#include<string>#include<math.h>#include<sstream>using namespace std;int str2int(string s){    int pos=s.find_first_of("-",0);    int num=0,mut=1;    for(int i=s.size();i!=0;i--)    {        num+=(s[i-1]-'0')*mut;        mut*=10;    }    if(pos==s.npos)        return num;    else         return -num;}//由字符串提取整型int maxY(int n1,int n2){    int max=n1>n2?n1:n2;    int min=n1<n2?n1:n2;    if(min==0)        return max;    else    {        if(max%min==0)            return min;        else            maxY(min,max%min);    }}//求取两整数的最大公约数string int2str(int n){    stringstream ss;    ss<<n;    return ss.str();}//将整型转化为字符串string getTrue(int n1,int n2){    int y=maxY(abs(n1),n2);    string result;    n1=n1/y;    n2=n2/y;    if(n2==1)        result=int2str(n1);    else if(abs(n1)>n2)    {        if(n1<0)        {            int i=abs(n1)/n2;            result=int2str(-i)+" "+int2str(abs(n1)%n2)+"/"+int2str(n2);        }else        {            int i=n1/n2;            n1=n1%n2;            result=int2str(i)+" "+int2str(n1)+"/"+int2str(n2);        }    }    else        result=int2str(n1)+"/"+int2str(n2);    if (n1<0)        return ("("+result+")");    else        return result;}//获得真分数形式string  calculate(int *s,char flag){    string result;    switch (flag)    {    case '*':        result=getTrue(s[0]*s[2],s[1]*s[3]);        break;    case '/':        if(s[2]==0)        {            result="Inf";            break;        }                   else if(s[2]<0)        {            result=getTrue(-s[0]*s[3],-s[1]*s[2]);            break;        }        else        {            result=getTrue(s[0]*s[3],s[1]*s[2]);            break;        }    case '+':        result=getTrue(s[0]*s[3]+s[1]*s[2],s[1]*s[3]);        break;    case '-':        result=getTrue(s[0]*s[3]-s[1]*s[2],s[1]*s[3]);        break;    }    return result;}//四则运算int main(){    fstream file("data.txt");    string line;    int  s[4];    getline(file,line);    int start=0;    int end=line.find_first_of("//",start);    s[0]=str2int(line.substr(start,end));    start=end+1;    end=line.find_first_of(" ",start);    s[1]=str2int(line.substr(start,end-start));    start=end+1;    end=line.find_first_of("//",start);    s[2]=str2int(line.substr(start,end-start));    s[3]=str2int(line.substr(end+1,line.size()-end-1));//从txt文件中读取输入    string s1=getTrue(s[0],s[1]);    string s2=getTrue(s[2],s[3]);    cout<<s1<<" + "<<s2<<" = "<<calculate(s,'+')<<endl;    cout<<s1<<" - "<<s2<<" = "<<calculate(s,'-')<<endl;    cout<<s1<<" * "<<s2<<" = "<<calculate(s,'*')<<endl;    cout<<s1<<" / "<<s2<<" = "<<calculate(s,'/')<<endl;    return 0;}
0 0
原创粉丝点击