给定输入的有理算法

时间:2015-08-05 09:36:02

标签: c++ c++11 c++14 rational-numbers

我目前正致力于https://open.kattis.com/problems/rationalarithmetic进行自己的练习。我得到4位数和一个操作。 输入为:x1 y1 op x2 y2,分数为x1 / y1和x2 / y2。如果我得到输入:1 3 + 1 2然后它的1/3 + 1/2并且答案应该给出最小的分数,所以它的5/6。 我通过我得到的测试用例,我无法弄清楚我做错了什么。 总结一下我的所作所为:

  1. 读取输入并检查操作是否为+, - ,/或*。我生成一个素数数组来找到最大的公约数。
  2. 根据操作的不同,将输入发送到函数。
  3. 我用简单的数学计算给定的输入。
  4. 然后我找到了最大的公约数,并将此除以分子和分母。
  5. 之后我打印出结果。
  6. 这是主要功能以及如果操作是*我如何处理。我处理其他操作相同,但使用其他数学。

         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 / %lld\n",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

2 个答案:

答案 0 :(得分:1)

我会向你提出以下建议:在处理理性时忘记找到有素数列表的最大公约数。这就是我们在学校所教的内容,但是使用Euclid's algorithm

可以更轻松(更有效地)解决这项任务的编程工作

答案 1 :(得分:0)

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

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

此外,在此代码中:

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

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