pat 乙级1034
本题要求编写程序,计算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)
这一题挺有意思的,就是写代码的时候太烦,最后测试不知怎么回事总有一个不通过,先把代码保存下来以后慢慢看。
#include<bits/stdc++.h> using namespace std; void outans(int a,int b) { if(b==0) { cout<<"Inf";return; }else if(a==0) { cout<<"0";return; } int signal=(a*b<0)? 1:0; a=abs(a),b=abs(b); if(signal) cout<<"(-"; if(a/b) cout<<a/b; if(a%b) { for(int i=(a>b)? b:a;i>1;i--) { if(a%i==0&&b%i==0) { a=a/i,b=b/i; } } printf("%s%d/%d",(a/b)? " ":"",a%b,b); } if(signal) cout<<")"; } int main() { int sign[2]={0},signal,num[4]={0}; string input[2]; cin>>input[0]>>input[1]; for(int i=0;i<2;i++) { signal=0; for(int j=0;j<input[i].size();j++) { if(input[i][j]=='-') sign[i]=1; else if(input[i][j]=='/') signal++; else num[2*i+signal]=10*num[2*i+signal]+(int)input[i][j]-48; } } if(sign[0]==1) num[0]=-num[0]; if(sign[1]==1) num[2]=-num[2]; outans(num[0],num[1]);cout<<" + ";outans(num[2],num[3]);cout<<" = "; //这里可以把两个分数并成两个字符串的,不然运行时间过长,每次输出的时候都要算一遍,
//不过这样的话代码量又要多不少。 outans(num[0]*num[3]+num[2]*num[1],num[1]*num[3]);cout<<endl; //个人觉得以目前计算机性能来说,这里不是必须这么做。 outans(num[0],num[1]);cout<<" - ";outans(num[2],num[3]);cout<<" = "; outans(num[0]*num[3]-num[2]*num[1],num[1]*num[3]);cout<<endl; outans(num[0],num[1]);cout<<" * ";outans(num[2],num[3]);cout<<" = "; outans(num[0]*num[2],num[1]*num[3]);cout<<endl; outans(num[0],num[1]);cout<<" / ";outans(num[2],num[3]);cout<<" = "; outans(num[0]*num[3],num[1]*num[2]);cout<<endl; return 0; }
例子中要把假分数转化为带分数,其实这挺好办,用‘/’运算可得商,用‘%’可得余数,‘余数/除数’就得到该带分数的分子部分。
我超爱学习的