프로젝트 오일러 33
가능한 케이스는 ax/ya 경우밖에 없음. ax/ay는 가능한 케이스가 없고, xa/ya 는 문제에서 묻는 trivial 한 경우밖에 안 생긴다. 최대 공약수 구하는 함수에 버그가 있는 줄 모르고, 다른 케이스가 있나 한참 따져보다가 삽질했다.
/*
Problem 33 - Digit cancelling Fractions
*/
#include <iostream>
#include <ctime>
#include <vector>
using namespace std;
int gcd( int x, int y)
{
int s; // smaller
int b; // bigger
if( x == y) return x;
if( x > y) { b = x; s = y; }
else { b = y; s = x; }
for(int i=s; i>=1; i--)
{
if ((b%i == 0) && (s%i == 0)) {
return i;
}
}
return 1;
}
class Fraction
{
public :
Fraction( int n, int d)
{
denominator = d;
numerator = n;
}
void print()
{
cout << numerator << "/" << denominator;
}
Fraction reduce()
{
int gcd_this = gcd( denominator, numerator);
int n = numerator / gcd_this;
int d = denominator / gcd_this;
Fraction f = Fraction( n, d);
return f;
}
bool operator == ( Fraction& rhs)
{
Fraction lf = reduce();
Fraction rf = rhs.reduce();
if( (lf.get_denominator() == rf.get_denominator()) &&
(lf.get_numerator() == rf.get_numerator())) {
print();
cout << " == ";
rhs.print();
cout << endl;
return true;
}
return false;
}
int get_denominator() { return denominator; }
int get_numerator() { return numerator; }
private :
int denominator;
int numerator;
};
int main(int argc, char** argv)
{
clock_t begin = clock();
/* starting code */
std::vector<Fraction> l;
// xa, ay
for(int x=0; x <10; x++)
{
for(int y=0; y<10; y++)
{
for( int a=0; a<10; a++)
{
int xa = 10*x + a;
int ay = 10*a + y;
if( xa > 9 && ay > 9 && xa < 100 && ay < 100) {
if( xa < ay && x < y) {
Fraction o1 = Fraction( xa, ay);
Fraction o2 = Fraction( x, y);
if( o1 == o2) {
l.push_back(o1);
}
}
}
}
}
}
int d = 1;
int n = 1;
for(int i=0; i<l.size(); i++)
{
l[i].print();
cout << endl;
n *= l[i].get_numerator();
d *= l[i].get_denominator();
}
Fraction answer = Fraction( n, d).reduce();
cout << "answer denominator = " << answer.get_denominator() << endl;
/* end of code */
clock_t end = clock();
std::cout << "elapsed time=" << double(end - begin) / CLOCKS_PER_SEC << std::endl;
return 0;
}