Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

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

  • initialize i :=0의 경우, i

    • 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 배열 만들기

  • initialize i :=0의 경우, i

    • ret가 비어 있지 않고 ret의 마지막 요소가 r[i]와 같으면 -

      • ret의 끝에 r[i] 삽입

  • 리턴 렛

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#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, ],]