zoukankan      html  css  js  c++  java
  • 有理数的四则运算

    链接:http://www.nowcoder.com/pat/6/problem/4060

    题目描述

    本题要求编写程序,计算2个有理数的和、差、积、商。

    输入描述:

    输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分

    母不为0。



    输出描述:

    分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的

    最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中

    没有超过整型范围的整数。

    输入例子:

    5/3 0/6

    输出例子:

    1 2/3 + 0 = 1 2/3

    1 2/3 - 0 = 1 2/3

    1 2/3 * 0 = 0

    1 2/3 / 0 = Inf

    思路:多加几个变量保存输入的有理数,1.用来保存最简形式 2.用来保存计算形式,就是通分过的形式。代码写起来比较复杂,还有输入格式的要求也比较多。

    浮点错误:出现了除以0的情况。
      1 #include "iostream"
      2 #include <iomanip>
      3 #include <string.h>
      4 #include <string>
      5 #include <vector>
      6 #include <cmath>
      7 #include <cctype>
      8 #include <algorithm>
      9 using namespace std;
     10  
     11 typedef struct YLS{
     12     int z;
     13     int fz;
     14     int fm;
     15 }YLS;
     16  
     17 void change(YLS &yls)
     18 {
     19     if(yls.fm == 0) return;
     20     if(yls.fz/yls.fm != 0)
     21     {
     22         yls.z += yls.fz/yls.fm;
     23         yls.fz = yls.fz%yls.fm;
     24     }
     25 }
     26 void tongFen(YLS &yls1, YLS &yls2)
     27 {
     28      
     29             int t1, t2;
     30             t1 = yls1.fm;
     31             t2 = yls2.fm;
     32             yls1.fz *= t2;
     33             yls1.fm *= t2;
     34             yls2.fz *= t1;
     35             yls2.fm *= t1;
     36 }
     37 void output1(YLS yls1)
     38 {
     39     int mark = 0;
     40     if(yls1.z<0 || yls1.fz<0 ||yls1.fm<0)
     41     {
     42         mark = 1;
     43         cout <<'(';
     44     }
     45     if(yls1.fz==0 && yls1.z==0)
     46     {
     47         cout <<0;
     48     }
     49     else
     50     {
     51         if(yls1.z == 0)
     52         {
     53             if(yls1.fm < 0)
     54             {
     55                 yls1.fm = -yls1.fm;
     56                 yls1.fz = -yls1.fz;
     57             }
     58             cout <<yls1.fz <<"/" <<yls1.fm;
     59         }
     60         else
     61         {
     62             if(yls1.fz == 0)
     63             {
     64                 cout <<yls1.z;
     65             }
     66             else
     67             {
     68                 if(yls1.fm < 0)
     69                 {
     70                     yls1.fm = -yls1.fm;
     71                     yls1.fz = -yls1.fz;
     72                 }
     73                 if(yls1.fz < 0)
     74                 {
     75                     if(yls1.z > 0)   yls1.z = -yls1.z;
     76                     yls1.fz = - yls1.fz;
     77                 }
     78                 cout <<yls1.z <<" " <<yls1.fz <<"/" <<yls1.fm;
     79             }
     80         }
     81     }
     82     if(mark == 1)   cout <<')';
     83     cout <<" " <<"/" <<" ";
     84     cout <<0;
     85     cout <<" " <<"=" <<" ";
     86     cout <<"Inf";
     87 }
     88 void output(YLS yls1, YLS yls2, char c, YLS yls3)
     89 {
     90     int mark = 0;
     91     if(yls1.z<0 || yls1.fz<0 || yls1.fm<0)
     92     {  
     93         mark = 1;
     94         cout <<'(';
     95     }
     96     if(yls1.fz==0 && yls1.z==0)
     97     {
     98         cout <<0;
     99     }
    100     else
    101     {
    102         if(yls1.z == 0)
    103         {
    104             if(yls1.fm < 0)
    105             {
    106                 yls1.fm = -yls1.fm;
    107                 yls1.fz = -yls1.fz;
    108             }
    109             cout <<yls1.fz <<"/" <<yls1.fm;
    110         }
    111         else
    112         {
    113             if(yls1.fz == 0)
    114             {
    115                 cout <<yls1.z;
    116             }
    117             else
    118             {
    119                 if(yls1.fm < 0)
    120                 {
    121                     yls1.fm = -yls1.fm;
    122                     yls1.fz = -yls1.fz;
    123                 }
    124                 if(yls1.fz < 0)
    125                 {
    126                     if(yls1.z > 0)   yls1.z = -yls1.z;
    127                     yls1.fz = - yls1.fz;
    128                 }
    129                 cout <<yls1.z <<" " <<yls1.fz <<"/" <<yls1.fm;
    130             }
    131         }
    132     }
    133     if(mark == 1)   cout <<')';
    134     cout <<" " <<c <<" ";
    135     mark = 0;
    136     if(yls2.z<0 || yls2.fz<0 || yls2.fm<0)
    137     {  
    138         mark = 1;
    139         cout <<'(';
    140     }
    141     if(yls2.fz==0 && yls2.z==0)
    142     {
    143         cout <<0;
    144     }
    145     else
    146     {
    147         if(yls2.z == 0)
    148         {
    149             if(yls2.fm < 0)
    150             {
    151                 yls2.fm = -yls2.fm;
    152                 yls2.fz = -yls2.fz;
    153             }      
    154             cout <<yls2.fz <<"/" <<yls2.fm;
    155         }
    156         else
    157         {
    158             if(yls2.fz == 0)
    159             {
    160                 cout <<yls2.z;
    161             }
    162             else
    163             {
    164                 if(yls2.fm < 0)
    165                 {
    166                     yls2.fm = -yls2.fm;
    167                     yls2.fz = -yls2.fz;
    168                 }
    169                 if(yls2.fz < 0)
    170                 {
    171                     if(yls2.z > 0)   yls2.z = -yls2.z;
    172                     yls2.fz = - yls2.fz;
    173                 }
    174                 cout <<yls2.z <<" " <<yls2.fz <<"/" <<yls2.fm;
    175             }
    176         }
    177     }
    178     if(mark == 1)   cout <<')';
    179     cout <<" " <<"=" <<" ";
    180     mark = 0;
    181     if(yls3.z<0 || yls3.fz<0 || yls3.fm<0)
    182     {
    183         mark = 1;
    184         cout <<'(';
    185     }
    186     if(yls3.fz==0 && yls3.z==0)
    187     {
    188         cout <<0;
    189     }
    190     else
    191     {
    192         if(yls3.z == 0)
    193         {
    194             if(yls3.fm < 0)
    195             {
    196                 yls3.fm = -yls3.fm;
    197                 yls3.fz = -yls3.fz;
    198             }
    199             cout <<yls3.fz <<"/" <<yls3.fm;
    200         }
    201         else
    202         {
    203             if(yls3.fz == 0)
    204             {
    205                 cout <<yls3.z;
    206             }
    207             else
    208             {
    209                 if(yls3.fm < 0)
    210                 {
    211                     yls3.fm = -yls3.fm;
    212                     yls3.fz = -yls3.fz;
    213                 }
    214                 if(yls3.fz < 0)
    215                 {
    216                     if(yls3.z > 0)   yls3.z = -yls3.z;
    217                     yls3.fz = -yls3.fz;
    218                 }
    219                 cout <<yls3.z <<" " <<yls3.fz <<"/" <<yls3.fm;
    220             }
    221         }
    222     }
    223     if(mark == 1)   cout <<')';
    224 }
    225 int gcd(int x, int y)
    226 {
    227     if(y != 0)
    228     {if(x%y == 0)
    229     {
    230         return y;
    231     }
    232     else
    233     {
    234         return gcd(y, x%y);
    235     }}
    236 }
    237 int main()
    238 {
    239     YLS yls1, yls2, yls3, yls4;
    240     yls1.z = 0;
    241     cin >>yls1.fz;
    242     getchar();
    243     cin >>yls1.fm;
    244     yls2.z = 0;
    245     cin >>yls2.fz;
    246     getchar();
    247     cin >>yls2.fm;
    248  
    249     yls3 = yls1;
    250     yls4 = yls2;
    251     int gys = 0;
    252     if(yls2.fz != 0)
    253     {
    254         gys = gcd(yls2.fz, yls2.fm);
    255     }
    256     if(gys != 0)
    257     {yls2.fz /= gys;
    258     yls2.fm /= gys;}
    259     gys = 0;
    260     if(yls1.fz != 0)
    261     {
    262         gys = gcd(yls1.fz, yls1.fm);
    263     }
    264     if(gys != 0)
    265     {yls1.fz /= gys;
    266     yls1.fm /= gys;}
    267     change(yls1);
    268     change(yls2);
    269      
    270     YLS ylsX,ylsY,ylsZ;
    271     ylsX = yls3;
    272     ylsY = yls4;
    273     tongFen(ylsX, ylsY);
    274     ylsZ.z = ylsX.z+ylsY.z;
    275     ylsZ.fz = ylsX.fz+ylsY.fz;
    276     ylsZ.fm = ylsX.fm;
    277     gys = 0;
    278     if(ylsZ.fz != 0)
    279     {
    280         gys = gcd(ylsZ.fz, ylsZ.fm);
    281     }
    282     if(gys != 0)
    283     {ylsZ.fz /= gys;
    284     ylsZ.fm /= gys;}
    285     change(ylsZ);
    286     output(yls1, yls2, '+', ylsZ);
    287     cout <<endl;
    288  
    289     ylsZ.z = ylsX.z-ylsY.z;
    290     ylsZ.fz = ylsX.fz-ylsY.fz;
    291     ylsZ.fm = ylsX.fm;
    292     gys = 0;
    293     if(ylsZ.fz != 0)
    294     {
    295         gys = gcd(ylsZ.fz, ylsZ.fm);
    296     }
    297     if(gys != 0)
    298     {ylsZ.fz /= gys;
    299     ylsZ.fm /= gys;}
    300     change(ylsZ);
    301     output(yls1, yls2, '-', ylsZ);
    302     cout <<endl;
    303  
    304     ylsZ.z = 0;
    305     ylsZ.fz = yls3.fz*yls4.fz;
    306     ylsZ.fm = yls3.fm*yls4.fm;
    307     change(ylsZ);
    308     gys = 0;
    309     if(ylsZ.fz != 0)
    310     {
    311         gys = gcd(ylsZ.fz, ylsZ.fm);
    312     }
    313     if(gys != 0)
    314     {ylsZ.fz /= gys;
    315     ylsZ.fm /= gys;}
    316     output(yls1, yls2, '*', ylsZ);
    317     cout <<endl;
    318  
    319     YLS yls5;
    320     yls5.fm = yls4.fz;
    321     yls5.fz = yls4.fm;
    322     if(yls4.fz == 0)
    323     {
    324         output1(yls1);
    325         cout <<endl;
    326     }
    327     else
    328     {
    329         ylsZ.z = 0;
    330         ylsZ.fz = yls3.fz*yls5.fz;
    331         ylsZ.fm = yls3.fm*yls5.fm;
    332         change(ylsZ);
    333         gys = 0;
    334         if(ylsZ.fz != 0)
    335         {
    336             gys = gcd(ylsZ.fz, ylsZ.fm);
    337         }
    338         if(gys != 0)
    339         {ylsZ.fz /= gys;
    340         ylsZ.fm /= gys;}
    341         output(yls1, yls2, '/', ylsZ);
    342         cout <<endl;
    343     }
    344     return 0;
    345 }
  • 相关阅读:
    JavaEE--JNDI(下,实现)
    JavaEE--JNDI(上,简介)
    JavaSE--java是值传递还是引用传递
    Mysql--主库不停机搭建备库
    MySQL--从库启动复制报错1236
    JVM·垃圾收集器与内存分配策略之垃圾收集器!
    mysql·事务挂起
    hash·余数hash和一致性hash
    关于正则效率问题(正则导致程序卡死)
    JVM·参数配置
  • 原文地址:https://www.cnblogs.com/mtc-dyc/p/4629440.html
Copyright © 2011-2022 走看看