ACM Judge Online 里面的一道题目,我提交的程序总是超时(用class的确是太奢侈了……),要有一个更高效的算法。
-------------------------------------------------------
题目:
分数的位置
Time Limit:1000MS  Memory Limit:65536K
Total Submit:247 Accepted:8
Description
题意描述:将所有的分母小于N的真分数(分子小于分母,数值小于1)从大到小排列出来后,例如当N=4时,所有的真分数有1/4,1/3,1/2,2/3,3/4。其中第三个真分数为1/2,其分子为1,分母为2。编一个程序,对给定的N,求出第M个真分数的值。
Input
输入文件中第一行有一个数N,第二行为一个数字M(N <10^5,M<10^9)。
Output
输出文件中有两行,第一行为分子K1,第二行为分母K2。其中K1 和K2没有除1以外的公约数。
Sample Input
4
3
Sample Output
1
2
----------------------------------------------------
我的代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int gcd(int M, int N); // greatest common divisor of M and n ( M > N)

class Fraction{
public:
Fraction(int m, int n); // m/n
//~Fraction();

int getNumerator() const;
int getDenominator() const;

friend bool operator < (Fraction f1, Fraction f2);
friend bool operator == (Fraction f1, Fraction f2);

private:
int numerator;
int denominator;
double value;
};

//
Fraction::Fraction(int m, int n){
int GreatestComDiv = gcd(n, m);
if ( GreatestComDiv != 1){ //
m /= GreatestComDiv;
n /= GreatestComDiv;
}
numerator = m;
denominator = n;
value = (double)m/(double)n;
}

int Fraction::getNumerator() const{
return numerator;
}

int Fraction::getDenominator() const{
return denominator;
}
//
bool operator < (Fraction f1, Fraction f2){
if (f1.value < f2.value){
return true;
}
else{
return false;
}
}

bool operator == (Fraction f1, Fraction f2){
if ((f1.numerator == f2.numerator) && (f1.denominator == f2.denominator)){
return true;
}
else{
return false;
}
}
//
int main(int argc, char* argv[]){
int n, orderOfFraction;
cin>>n;
cin>>orderOfFraction;

vector<Fraction> fractions;
typedef vector<Fraction>::size_type vec_sz;

for (int i = n; i >= 2; --i){
for (int j = i-1; j >= 1; --j){
Fraction f(j, i);

bool equal = false;
vec_sz l = fractions.size();
for (vec_sz k = 0; k < l; ++k){
if (f == fractions[k]){
equal = true;
}
}

if (!equal){
fractions.push_back(f);
}
}
}

sort(fractions.begin(), fractions.end());

cout<<fractions[orderOfFraction-1].getNumerator()<<endl;
cout<<fractions[orderOfFraction-1].getDenominator()<<endl;

return 0;
}

int gcd(int m, int n){
while (n != 0){
int r = m % n;
m = n;
n = r;
}

return m;
}