C ++中的唯一分数

假设我们有一个分数列表,其中每个分数都包含[分子,分母](分子/分母)。我们找到了一个新的分数列表,以使分数中的数字为-

  • 用他们最简化的话来说。(20/14变成10/7)。

  • 任何重复的馏分(还原后)将被除去。

  • 按其实际值升序排列。

  • 如果数字为负数,则分子将带有'-'符号。

因此,如果输入类似于{{16,8},{4,2},{7,3},{14,6},{20,4},{-6,12}},则输出将是[[-1,2],[2,1],[7,3],[5,1]]

为了解决这个问题,我们将遵循以下步骤-

  • 定义一组

  • n:= v的大小

  • 使数组r

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • c:= | v [i,0] |的gcd 和| v [i,1] |

    • v [i,0]:= v [i,0] / c

    • v [i,1]:= v [i,1] / c

    • 在r的末尾插入{v [i,0],v [i,1]}

  • 根据其值对数组r进行排序

  • 使数组ret

  • 对于初始化i:= 0,当i <r的大小时,更新(将i增加1),执行-

    • 在ret的末尾插入r [i]

    • 如果ret不为空并且ret的最后一个元素与r [i]相同,则-

  • 返回ret

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto>> v) {
   cout << "[";
   for (int i = 0; i < v.size(); i++) {
      cout << "[";
      for (int j = 0; j < v[i].size(); j++) {
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]" << endl;
}
class Solution {
   public:
   static bool cmp(vector <int>& a, vector <int>& b){
      double aa = (double)a[0] / (double)a[1];
      double bb = (double)b[0] / (double)b[1];
      return aa < bb;
   }
   vector<vector<int>> solve(vector<vector<int>>& v) {
      set < vector <int> > s;
      int n = v.size();
      vector < vector <int> > r;
      for(int i = 0; i < n; i++){
         int c = __gcd(abs(v[i][0]), abs(v[i][1]));
         v[i][0] /= c;
         v[i][1] /= c;
         r.push_back({v[i][0], v[i][1]});
      }
      sort(r.begin(), r.end(), cmp);
      vector < vector <int> > ret;
      for(int i = 0; i < r.size(); i++){
         if(!ret.empty() && ret.back() == r[i]) continue;
         ret.push_back(r[i]);
      }
      return ret;
   }
};
int main(){
   vector<vector<int>> v = {{16, 8},{4, 2},{7, 3},{14, 6},{20, 4},{-
   6, 12}};
   Solution ob;
   print_vector(ob.solve(v));
}

输入值

{{16, 8},{4, 2},{7, 3},{14, 6},{20, 4},{-6, 12}}

输出结果

[[-1, 2, ],[2, 1, ],[7, 3, ],[5, 1, ],]