1. 程式人生 > >pat 乙級1034

pat 乙級1034

using sin 例子 寫代碼 計算機性能 inpu 運行時間 時間 i++

本題要求編寫程序,計算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; }

例子中要把假分數轉化為帶分數,其實這挺好辦,用‘/’運算可得商,用‘%’可得余數,‘余數/除數’就得到該帶分數的分子部分。

pat 乙級1034