• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 412
  • Last Modified:

Need math function (or algorithm) for reducing fractions

I need to find a C++ math library function for reducing fractions, but have not been able to find one. Is there one available? If not, can you help me with an algortihm to do this i.e. how to get an answer of 3/5 when the input was 6/10?
0
englm
Asked:
englm
  • 5
  • 4
1 Solution
 
q2guoCommented:
The following function is not the most efficient funciton for doing fraction reduction.  But its the only one I can come
up with in 2 minutes.

The argument d and n represent denominator and neminator respectively.


void Reduce(int &d, int &n) {
    for (int i = n/2; i > 1; i--) {
        if ( (n%i) == 0) {
            if ( (d%i) == 0) {
                 n = n / i;
                 d = d / i;
                 break;
            }
        }
    }
}
0
 
ozoCommented:
//Heres one Euclid came up with over 2 millennia ago
int gcd(int a,int b){
  while( b ){
    int c;
    c = a%b;
    a = b;
    b = c;
  }
  return a;
}

main(int argc,char *argv[]){
   int d,n,f;
   d = atoi(argv[1]);
   n = atoi(argv[2]);
   f = gcd(d,n);
   printf("%d/%d\n",d/f,n/f);
}

0
 
ozoCommented:
(If n was supposed to represent the numerator, I think I got my variable names backwards)

But it looks like Reduce(4,4) will only reduce to 2/2
and Reduce(4,-4) seems to have an even worse problem.
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
Ready4DisCommented:
Why (q2guo) do you start at n/2? Shouldn't you check to see which is heigher?  What if the fraction is 10/2.? It will return 10/2 which can be 5/1...
0
 
q2guoCommented:
Ready4Dis, I assumed that the fraction is a pure one, meaning that the numerator is always smaller that the denominator.
0
 
ozoCommented:
Then if n is assumed to be smaller than d, shouldn't you have started with d/2?
(I think that's what confused my labels:-) fortunately, the gcd approach doesn't depend such assumptions.
0
 
q2guoCommented:
ozo: why would you start with d/2?  Since n is smaller than d
all i(s) between d/2 and n/2 are just extra work.
0
 
ozoCommented:
Given a fraction like 2/10, with the numerator 2 smaller than the denominator 10,
starting i=n/2 i.e. i=1 will fail to reduce it to 1/5
(with a fraction like 10/2, since n=10 and d=2, i=n/2 would start at 5, so Reduce(2,10) would find (10/2)/(2/2) = 5/1)

0
 
q2guoCommented:
Ok, here is the function again

void Reduce(int &d, int &n) {
        int temp = (d >= n ? d : n);
        for (int i = temp; i > 1; i--) {
            if ( (n%i) == 0) {
                if ( (d%i) == 0) {
                     n = n / i;
                     d = d / i;
                     break;
                }
            }
        }
}
0
 
ozoCommented:
Still has a problem with -10/2
Here's my (Euclid's) function again with the variables renamed:

int gcd(int a,int b){
  while( b ){
    int c = a%b;
    a = b;
    b = c;
  }
  return a;
}

main(int argc,char *argv[]){
   int n,d,i;
   n = atoi(argv[1]);
   d = atoi(argv[2]);
   i = gcd(n,d);
   printf("%d/%d\n",n/i,d/i);
}


0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 5
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now