簡體   English   中英

如何使用C ++對p / q formate中的數字進行排序

[英]How to sort number that are in p/q formate using c++

給定正整數n ,您必須按升序打印由0到1之間的分數組成的序列

*輸入-6。

輸出-0/1,1/6,1/5,1/4,1/3,2/5,1/2,3/6,3/5,2/3,3/4,4/5, 5/6,1/1。

我已經用C ++編寫了代碼,但是沒有給出正確的輸出

#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;

long gcd(long a, long b);

void foo(double input)
{    

     double frac = input ;
    const long precision = 1000000000; // This is the accuracy.

    long gcd_ = gcd(round(frac * precision), precision);

    long denominator = precision/gcd_;
    long numerator = round(frac * precision) / gcd_;
    cout << numerator << "/" << denominator <<",";
}

long gcd(long a, long b){

if (a == 0)
        return b;
    else if (b == 0)
        return a;

    if (a < b)
        return gcd(a, b % a);
    else
        return gcd(b, a % b);
}


int main()
{

    double n;
    set<double>s;
    int c=0;
    cin>>n;
    for(int i=1;i<n;i++)
    {
        for(int j=n;j>0;j--)
        {
            if(i<j)
            {
            s.insert((double)i/j);
            }


        }
    }
    cout<<"0/1"<<",";
    while(!s.empty())
    {
        foo(*s.begin());
          s.erase(s.begin());
    }
    cout<<"1/1";

輸出-0/1,166666667/1000000000,1/5,1 / 4,333333333 / 1000000000,2/5,1/2,3/5,666666667/1000000000,3/4,4 / 5,833333333 / 1000000000, 1/1

這是錯誤的解決方法。

您應該嘗試制作一個分數類,該分數類存儲分子和分母並直接使用它們。

這樣的事情應該起作用:

struct fraction {
  int numerator, denominator;
  bool operator<(const fraction& f) const {
    return numerator*f.denominator < f.numerator*denominator;
  }
}

這僅僅是一件簡單的事情,應該針對您所擁有的輸入類型起作用,但是您可能需要對其進行專門化處理(負數,大分子和分母,處理相同分數的不同表示形式……)

我認為當您可以簡單地記住分子和分母時,嘗試重新計算分子和分母是一個壞主意。

如果您使用std::map<double, std::pair<int, int>>代替std::set<double> ,則可以使用鍵( double )對分數和值進行排序(一個std::pair<int, int> )來打印它們。

因此foo()可以接收分子和分母。

以下是完整的示例

#include<map>
#include<iostream>

constexpr long gcd (long a, long b)
 { return (a == 0) ? b
                   : (b == 0) ? a
                              : (a < b) ? gcd(a, b % a)
                                        : gcd(b, a % b); }

void foo (long num, long den)
 {    
   long const g { gcd(num, den) };

   std::cout << (num / g) << '/' << (den / g) << ", ";
 }

int main ()
 {
   int n;

   std::map<double, std::pair<int, int>> m;

   std::cin >> n;

   for ( auto i = 0 ; i < n ; ++i )
    {
      for ( auto j = n ; j > i ; --j )
            m.emplace(std::piecewise_construct,
                      std::forward_as_tuple(double(i)/j),
                      std::forward_as_tuple(i, j));
    }

   for ( auto const e : m )
      foo( e.second.first, e.second.second );

   std::cout << "1/1" << std::endl;
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM