首页 > 编程知识 正文

浙江大学pat刷题,浙大pat答案

时间:2023-05-03 07:24:25 阅读:233601 作者:1179

计算机中采用浮点数表示所有实数,但这意味着精度丢失。例如无法精确表示“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;elseb=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]!='';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/%dn",-fenzi/ys,fenmu/ys);}else{int ys=hj(fenzi,fenmu);printf("%d/%dn",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/%dn",-fenzi/ys,fenmu/ys);}else{int ys=hj(fenzi,fenmu);printf("%d/%dn",fenzi/ys,fenmu/ys);}}return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。