如何使用c ++对p / q格式中的数字进行排序

时间:2017-02-02 15:18:50

标签: c++ sorting c++11 fractions

给定正整数n,您必须按升序打印序列,该序列由0到1之间的分数组成

*输入 - 6。

输出-0 / 1,1 / 6,1 / 5,1 / 4,1 / 3,2 / 5,1 / 2,3 / 6,3 / 2,5 / 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";

output- 0 / 1,16666667 / 1000000000,1 / 5,1 / 4,333333333 / 1000000000,2 / 5,1 / 2,6 / 5,666666667 / 100,0000000,3 / 4,4 / 5,833333333 / 1000000000,1 / 1

2 个答案:

答案 0 :(得分:1)

这是错误的做法。

你应该尝试制作一个存储分子和分母的分数类,并直接使用它们。

这样的事情应该有效:

class Program
{
    static void Main(string[] args)
    {
        User user = new User();
        user.FirstName = "Sandeep";
        user.LastName = "Sihari";
        user.Age = 15;
        user.Sex = "Male";
        user.JoiningDate = DateTime.Now;
        user.UserName = "qwerty";
        user.HashedPassword = CalculateHash("qwerty", user.UserName);

        Contact contact = new Contact();
        contact.Type = new ContactType() { Name = "Office" };
        contact.Name = "Sandeep";
        contact.Number = "123456";
        contact.Description = "No description";
        user.AddContact(contact);

        ISessionFactory factory = new SessionFactory();
        IUnitOfWork unitOfWork = factory.CurrentUoW;
        IRepository repository = new Repository(unitOfWork);
        unitOfWork.BeginTransaction();

        repository.AddEntity(user);

        unitOfWork.CommitTransaction();

        Console.WriteLine("Operation completed.");

        Console.ReadLine();
    }

    private static string CalculateHash(string clearTextPassword, string salt)
    {
        // Convert the salted password to a byte array
        byte[] saltedHashBytes = Encoding.UTF8.GetBytes(clearTextPassword + salt);
        // Use the hash algorithm to calculate the hash
        HashAlgorithm algorithm = new SHA256Managed();
        byte[] hash = algorithm.ComputeHash(saltedHashBytes);
        // Return the hash as a base64 encoded string to be compared to the stored password
        return Convert.ToBase64String(hash);
    }
}

这只是裸露的东西,应该适用于你所拥有的那种输入,但你可能需要专门化它(负数,大分子和分母,处理相同分数的不同表示......)

答案 1 :(得分:0)

我认为当你只是记住它们时,尝试重新计算分子和分母是一个坏主意。

如果您使用std::set<double>而不是std::map<double, std::pair<int, int>>,则可以使用键(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;
 }