Pat1034代碼
本題要求編寫程序,計算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<cstdio>
#include<cstdlib>
using namespace std;
long Gcd(long a,long b){
long temp;
if(a<0)
a=-a;
if(b<0)
b=-b;
while(b!=0){
temp=a%b;
a=b;
b=temp;
}
return a;
}
void featureNormalize(long *k,long *a,long *b){
long gcd=Gcd(*a,*b);
*a=*a/gcd;
*b=*b/gcd;
if(*a<0){
*a=-*a;
if(*a>=*b){
*k=(*a)/(*b);
*a=(*a)%(*b);
*k=-*k;
}else{
*a=-*a;
*k=0;
}
}else{
if(*a>=*b){
*k=(*a)/(*b);
*a=(*a)%(*b);
}else{
*k=0;
}
}
}
void output(long k,long a,long b){
if(k<0){
printf("(%ld",k);
if(a==0){
printf(")");
}else{
printf(" %ld/%ld)",a,b);
}
}else if(k>0){
if(a>0){
printf("%ld %ld/%ld",k,a,b);
}else if(a==0){
printf("%ld",k);
}
}else{
if(a>0){
printf("%ld/%ld",a,b);
}else if(a==0){
printf("0");
}else{
printf("(%ld/%ld)",a,b);
}
}
}
int main(int argc,char *argv[]){
long a1,b1,a2,b2,a3,b3;
long k1,k2,k3;
long n,m,p,q;
char opt[4]={'+','-','*','/'};
scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);
n=a1;
m=b1;
p=a2;
q=b2;
featureNormalize(&k1,&a1,&b1);
featureNormalize(&k2,&a2,&b2);
for(long i=0;i<4;i++){
output(k1,a1,b1);
switch (opt[i]){
case '+':
a3=n*q+p*m;
b3=m*q;
printf(" + ");
break;
case '-':
a3=n*q-p*m;
b3=m*q;
printf(" - ");
break;
case '*':
a3=n*p;
b3=m*q;
printf(" * ");
break;
case '/':
a3=n*q;
b3=m*p;
printf(" / ");
break;
}
output(k2,a2,b2);
printf(" = ");
if(opt[i]=='/'&&b3==0){
printf("Inf\n");
}else{
if(b3<0){
b3=-b3;
a3=-a3;
}
featureNormalize(&k3,&a3,&b3);
output(k3,a3,b3);
printf("\n");
}
}
return 0;
}
注意:這裏不能用int,否則會出現浮點數錯誤。貌似這題寫得太繁瑣了,有時間再優化吧。