计算机中采用浮点数表示所有实数,但这意味着精度丢失。例如无法精确表示“1/3”。
NowCoder最近要处理很多金融问题,这些账目不允许出现精度丢失,因为差之毫厘谬之千里。你能帮他实现一套分数的计算器吗?
输入包含多组数据。
每组数据一行,包含两个分数和一个运算符,中间用空格隔开。
其中分子与分母均为不大于30的正整数。
对应每一组数据,输出两个分数的计算结果。
要求输出最简分数,即分子与分母互质。
输入例子
1/3 2/3 +
1/5 1/4 -
1/2 1/3 *
2/3 4/3 /
输出例子
1/1
-1/20
1/6
1/2
#include<cstdio>
int hj(int a,int b){
while(a!=b){
if(a>b)
a=a-b;
else
b=b-a;
}
return a;
}//这是一个用来化简的函数,return的a是分子分母的公约数
int main(int argc,char const *argv[]){
int n1_1 ,n1_2,n2_1,n2_2;
int i;
char s[100];//因为输入是字符的形式,所以用char数组来存储
while(gets(s)){//这是c++的输入
n1_1=n1_2=n2_1=n2_2=0;
int flag=0;
for(i=0;s[i]!=' '&&s[i]!='\0';i++){
if(flag==0){
if(s[i]>='0'&&s[i]<='9')
n1_1=(s[i]-'0')+n1_1*10;//*10是因为保证多位数也行
if(s[i]=='/')//遇到/,存储的数字位置就会发生改变
flag=1;
}else{
if(s[i]>='0'&&s[i]<='9')
n1_2=(s[i]-'0')+n1_2*10;
}
}
i++;flag=0;//i++目的是为了跳过' '对后面进行判断
for(;s[i]!=' '&&s[i]!='0';i++){
if(flag==0){
if(s[i]>='0'&&s[i]<='9')
n2_1=(s[i]-'0')+n2_1*10;
if(s[i]=='/')
flag=1;
}else{
if(s[i]>='0'&&s[i]<='9')
n2_2=(s[i]-'0')+n2_2*10;
}
}
char op=s[++i];
int fenzi=0,fenmu=0;//以下是分母分子在+-*/处的变化规律
if(op=='+'){
fenzi=n1_1*n2_2+n1_2*n2_1;
fenmu=n1_2*n2_2;
}else if(op=='-'){
fenzi=n1_1*n2_2-n1_2*n2_1;
fenmu=n1_2*n2_2;
}else if(op=='*'){
fenzi=n1_1*n2_1;
fenmu=n1_2*n2_2;
}else if(op=='/'){
fenzi=n1_1*n2_2;
fenmu=n1_2*n2_1;
}
if(fenzi<0){
int ys=hj(-fenzi,fenmu);
printf("-%d/%d\n",-fenzi/ys,fenmu/ys);
}else{
int ys=hj(fenzi,fenmu);
printf("%d/%d\n",fenzi/ys,fenmu/ys);
}
}
return 0;
}
用C的方法写
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int hj(int a,int b){
if(b%a==0)
return a;
return hj(b%a,a);
}
int main(){
int n11,n12,n21,n22;
int fenzi,fenmu;
char op;
while(~scanf("%d/%d %d/%d %c",&n11,&n12,&n21,&n22,&op)){
switch (op)
{
case '+':
fenzi=n11*n22+n12*n21;
fenmu=n12*n22;
break;
case '-':
fenzi=n11*n22-n12*n21;
fenmu=n12*n22;
break;
case '*':
fenzi=n11*n21;
fenmu=n12*n22;
break;
case '/':
fenzi=n11*n22;
fenmu=n12*n21;
break;
}
if(fenzi<0){
int ys=hj(-fenzi,fenmu);
printf("-%d/%d\n",-fenzi/ys,fenmu/ys);
}else{
int ys=hj(fenzi,fenmu);
printf("%d/%d\n",fenzi/ys,fenmu/ys);
}
}
return 0;
}