1034 有理数四则运算 (20 分)
题目链接:1034 有理数四则运算 (20 分)
这道题目终于AC了,这两天寒假在家里事情比较多,没有专门的时间来思考这道题目,反正过程挺坎坷的。
遇到的困难:
1、数据读入方式不对(读入方式麻烦)
2、分数的约分(即求两个整数的最大公约数的算法不了解)
3、按照题目要求的格式输出没有熟练掌握
对于第一个问题,刚开始我是用C++的getline(cin,str)来读入数据的,然后编写一个解析字符串数据的函数,这样做
很麻烦而且没有成功。后来借鉴网上大神们的操作,直接用C语言的scanf("%d/%d",&fenzi,&fenmu)来读入特殊格式
的数据。这样就简便多了。
对于第二个问题,求最大公约数,我刚开始用的是穷举法,但是这样做完全没有考虑过时间复杂度的感受,果然提交后
有两个测试点超时,于是我上网检索求最大公约数的算法,找到了两个高效的算法:辗转相除和更相减损算法。
对于第三个问题,多多练习,审清题意。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 struct NumNode 5 { 6 long long int fenzi; 7 long long int fenmu; 8 long long int zh; 9 bool sign; 10 }; 11 12 int gcd(int a,int b) 13 { 14 return (b>0)?gcd(b,a%b):a; 15 } 16 void StandardNum(long long int a,long long int b,NumNode &num) 17 { 18 if(b<0) 19 { 20 a*=-1;b*=-1; 21 } 22 if(a==0) //分子为0 23 { 24 //cout<<"Here"<<endl; 25 num.fenzi=num.fenmu=0;num.zh=0;num.sign=true; //负号为+ 26 } 27 else 28 { 29 if(abs(a)%b==0) //可以除尽 30 { 31 num.zh=abs(a)/b;num.fenmu=num.fenzi=0; 32 } 33 else 34 { 35 num.zh=abs(a)/b;num.fenzi=abs(a)%b;num.fenmu=b; 36 } 37 //最后判定符号z 38 if(a<0) 39 num.sign=false; //负号 40 else 41 num.sign=true; // 42 } 43 long long int n; 44 if(num.fenzi!=0&&num.fenmu!=0) //可以进行约分 45 { 46 int n=gcd(num.fenzi,num.fenmu); 47 num.fenzi/=n; 48 num.fenmu/=n; 49 } 50 } 51 void print(NumNode num1) 52 { 53 if(!num1.sign) 54 printf("(-"); 55 if(num1.zh!=0) 56 { 57 cout<<num1.zh; 58 if(num1.fenzi!=0) 59 printf(" "); 60 } 61 if(num1.fenzi!=0) 62 printf("%lld/",num1.fenzi); 63 if(num1.fenmu!=0) 64 printf("%lld",num1.fenmu); 65 if(!num1.sign) 66 printf(")"); 67 if(num1.zh==0&&num1.fenzi==0) 68 printf("0"); 69 } 70 71 void calculate(int kind,long long int a1,long long int b1,long long int a2,long long int b2) 72 { 73 bool flag=false; //默认商不为0 74 NumNode num1,num2; 75 StandardNum(a1,b1,num1); 76 print(num1); 77 long long int fenzi,fenmu; 78 switch(kind) 79 { 80 case 0: //计算和 81 printf(" + "); 82 fenzi=a1*b2+a2*b1; 83 fenmu=b1*b2; 84 break; 85 case 1: //计算差 86 printf(" - "); 87 fenzi=a1*b2-a2*b1; 88 fenmu=b1*b2; 89 break; 90 case 2: //计算积 91 printf(" * "); 92 fenzi=a1*a2; 93 fenmu=b1*b2; 94 break; 95 case 3: //计算商 96 printf(" / "); 97 if(a2==0) 98 flag=true; //商为0 99 fenzi=a1*b2; 100 fenmu=a2*b1; 101 break; 102 } 103 StandardNum(a2,b2,num2); 104 print(num2); 105 printf(" = "); 106 if(!flag) 107 { 108 StandardNum(fenzi,fenmu,num2); 109 print(num2); 110 } 111 else 112 printf("Inf"); 113 printf("\n"); 114 } 115 int main() 116 { 117 long long int a1,b1,a2,b2; 118 scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2); 119 for(int i=0;i<4;i++) 120 calculate(i,a1,b1,a2,b2); 121 return 0; 122 }