给定输入的有理数运算

rational arithmetic from given input

本文关键字:有理数 运算 输入      更新时间:2023-10-16

我目前正在为自己的实践https://open.kattis.com/problems/rationalarithmetic工作。我得到4位数字和一个运算。输入是x1 y1和x2 y2分数是x1/y1和x2/y2。如果我得到输入:1 3 + 1 2,那么它是1/3 + 1/2答案应该是最小分形,所以是5/6。我通过了我得到的测试用例,但我不知道我做错了什么。总结我的工作:

  1. 读取输入,如果是+、-、/或*,检查操作。我生成一个素数数组来找到最大的公约数。
  2. 根据操作将输入发送给函数
  3. 我用简单的数学计算给定输入。
  4. 然后我找到最大的公约数,并除以分子和分母。
  5. 之后,我在结果中打印出来。

下面是main函数和我如何处理如果操作是*。我用相同的方法处理其他操作,但使用了其他数学方法。

     void mult(int *x1, int *y1, int *x2, int *y2){
      long long top = (*x1) * (*x2);
      long long bottom = (*y2) * (*y1);
      long long frac;
      if(bottom != 0||top != 0){
          frac = commonDiv(top,bottom);
     }else{
         frac = 1;
     }
     string sign = "";
     if(top * bottom < 0){
         sign = "-";
      }else{
         sign = "";
      }
     printf("%s%lld / %lldn",sign.c_str(),abs(top/frac),abs(bottom/frac) );
    }

     int main()
     {
     int numOp;
     scanf("%d", &numOp);
     getPrime(1,sqrt(100000));
     while(numOp != 0){
      int x1,x2,y1,y2;
      char op[2];
      scanf("%d %d %s %d %d", &x1, &y1, op, &x2, &y2);
      if( op[0] == '+'){
        add(&x1, &y1, &x2,&y2);
      }
      else if(op[0] == '-'){
        sub(&x1,&y1,&x2,&y2);
      }
      else if(op[0] == '/'){
        divi(&x1,&y1,&x2,&y2);
     }
     else{
        mult(&x1,&y1,&x2,&y2);
    }
     numOp--;
    }   
    }
这是我的代码与给定的测试用例,我得到正确的结果。我需要一些不同测试用例的技巧或任何建议。http://ideone.com/jBddSI

我要给你以下建议:当处理有理数时,忘记用素数列表查找最大公约数。这是我们在学校里学到的东西,但是在编程时,用欧几里得算法可以更容易(更有效)地解决这个问题

我不明白为什么你只在[1,10000]范围内寻找素数,而你分解的数字可以达到(10^9)^2 = 10^18但是正如Marom所说,你应该使用gdc算法。

此外,我不明白你为什么在你的函数(add,divi…)中传递指针给int。

同样,在这段代码中:

      long long top = (*x1) * (*x2);

我认为如果x1和x2太大就会发生溢出,因为强制转换发生在整数乘法之后(而不是long long int)。