|
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
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; }
本文出自 “Wenbo_Dai's_Tech_Blog” 博客,请务必保留此出处http://wenbodai.blog.51cto.com/267289/52495 本文出自 51CTO.COM技术博客 |