englm
asked on
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?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
(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.
But it looks like Reduce(4,4) will only reduce to 2/2
and Reduce(4,-4) seems to have an even worse problem.
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...
Ready4Dis, I assumed that the fraction is a pure one, meaning that the numerator is always smaller that the denominator.
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.
(I think that's what confused my labels:-) fortunately, the gcd approach doesn't depend such assumptions.
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.
all i(s) between d/2 and n/2 are just extra work.
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)
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)
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;
}
}
}
}
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;
}
}
}
}
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);
}
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);
}
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);
}