zoukankan      html  css  js  c++  java
  • PAT 1034. 有理数四则运算(20)

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

    输入格式:

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

    输出格式:

    分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。

    输入样例1:

    2/3 -4/2
    

    输出样例1:

    2/3 + (-2) = (-1 1/3)
    2/3 - (-2) = 2 2/3
    2/3 * (-2) = (-1 1/3)
    2/3 / (-2) = (-1/3)
    

    输入样例2:

    5/3 0/6
    

    输出样例2:

    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 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<ctype.h>
     5 #include<math.h>
     6 void simp(long *a,long *b){
     7     long temp,temp1,temp2;
     8     temp = *a;
     9     temp1 = *b;
    10     while(temp1){
    11         temp2 = temp%temp1;
    12         temp = temp1;
    13         temp1 = temp2;
    14     }
    15     *a = *a/temp;
    16     *b = *b/temp;
    17 }
    18 
    19 void print(long a,long a1){
    20     long ka = a/a1;
    21     a = a%a1;
    22     if(a<0||a1<0||ka<0)
    23         printf("(");
    24     if(a==0)
    25         printf("%ld",ka);
    26     else if(ka!=0)
    27         printf("%ld %ld/%ld",ka,abs(a),abs(a1));
    28     else{
    29         if(a1<0){
    30             a = -a;
    31             a1 = -a1;
    32         }
    33         printf("%ld/%ld",a,a1);
    34     }
    35         
    36     if((a<0||a1<0||ka<0))
    37         printf(")");
    38         
    39 }
    40 
    41 void print1(long a,long a1,long b,long b1,long c,long c1,char k){
    42     simp(&c,&c1);
    43     print(a,a1);
    44     printf(" %c ",k);
    45     print(b,b1);
    46     printf(" = ");
    47     print(c,c1);
    48     printf("
    ");
    49 }
    50 
    51 int main(){
    52     long a,a1,b,b1;
    53     long c[5][2];
    54     char sign[5]={'+','-','*','/'};
    55     scanf("%ld/%ld",&a,&a1);
    56     scanf("%ld/%ld",&b,&b1);
    57     
    58     simp(&a,&a1);
    59     simp(&b,&b1);
    60     
    61     c[0][1] = b1*a1;
    62     c[0][0] = a*b1+b*a1;
    63     c[1][1] = b1*a1;
    64     c[1][0] = a*b1-b*a1;
    65     c[2][1] = b1*a1;
    66     c[2][0] = a*b;
    67     c[3][1] = a1*b;
    68     c[3][0] = a*b1;
    69     
    70     for(int i=0;i<3;i++){
    71         print1(a,a1,b,b1,c[i][0],c[i][1],sign[i]);
    72     }
    73     
    74     if(b==0){
    75         print(a,a1);
    76         printf(" / ");
    77         print(b,b1);
    78         printf(" = ");
    79         printf("Inf");
    80         return 0;
    81     }else{
    82         print1(a,a1,b,b1,c[3][0],c[3][1],sign[3]);
    83     }     
    84 }
  • 相关阅读:
    StringTemplate.Net 学习笔记(9):深入了解模板组文件
    StringTemplate.Net 学习笔记(6):自定义输出格式
    StringTemplate.Net 学习笔记(4):表达式元素语法(下)
    StringTemplate.Net 学习笔记(10):模板组继承及模板组接口
    StringTemplate.Net 学习笔记(3):表达式元素语法(上)
    StringTemplate.Net 学习笔记(7):加载模板文件
    StringTemplate.Net 学习笔记(8):加载模板组文件
    十天学会ASP.Net——(10)
    十天学会ASP.Net——(6)
    十天学会ASP.Net——(7)
  • 原文地址:https://www.cnblogs.com/lolybj/p/6225769.html
Copyright © 2011-2022 走看看