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 } 

 

posted @ 2019-01-18 22:55  focusDing  阅读(441)  评论(0编辑  收藏  举报