浙大PAT练习题1012

23 篇文章 0 订阅

计算机中采用浮点数表示所有实数,但这意味着精度丢失。例如无法精确表示“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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值