Finding ratio of 2 numbers in C++

Viewed 406

I'm currently learning C++ using PPP by Bjarne Stroustrup. There is a Practice question:

Write a program that prompts the user to enter two integer values. Store these values in int variables named val1 and val2. Write your program to determine the smaller, larger, sum, difference, product, and ratio of these values and report them to the user.

For ratio I want it to be like The ratio of 500 and 700 is 5:7. I known the answer of this could be

double ratio = 500/700;

But I want to show this as 5:7 rather than 500/700 = 0.714.

How can I do that?

Edit: - That's how I did it.

#include <iostream>
#include <cmath>

void Ratio(double val1, double val2)
{
    double temp1 = val1;
    double temp2 = val2;
    for(int num = 0; num < 20; num++)
    {
        if(num == 0 || num == 1)
            continue;

        if(std::fmod(temp1, num) == 0 && std::fmod(temp1, num) == 0) 
        {
            temp1 /= num;
            temp1 /= num;
            num = 0;
        }
    } 
    std::cout<<"Ratio of " << val1 << " and " << val2 << " is " << val1 << ":" << val2<< std::endl;
}

int main()
{
    Ratio(500, 700);
}

I'm still a beginner in programming and this really is something for me. Anyone have a better solution for this.

3 Answers

You are working with the wrong algorithm: in order to find the ratio between two numbers a and b, you are doing:

calculate a/b;
do something with the result.

This does not work, as computers don't understand rational numbers (in mathematics, 1/3 is different from 0.333333333, but for a computer both are equal because computer cannot handle infinite decimals).

Therefore you need to adopt another algorithm, which is the following:

calculate the greatest common divisor of a and b (ggd(a,b))
Show: a / ggd(a,b)
      b / ggd(a,b)

As @Dominique points out:

You are working with the wrong algorithm: In order to find the ratio between two numbers a and b, you are doing:

calculate a/b; 
do something with the result.

This does not work, as computers don't understand rational numbers (in mathematics, 1/3 is different from 0.333333333, but for a computer both are equal because computer cannot handle infinite decimals).

What you want is to simplified a fraction (reducing it to the simplest form). To do this, you can divide both a and b by gcd(a,b). gcd() of two numbers can be calculated with Euclidean algorithm, or by using directly the __gcd() function.

Code:

#include <iostream>
#include <cmath>
using namespace std;

int gcd(int a, int b)
{
    if (b == 0) {return a;}
    return gcd(b, a%b);
}

pair<int, int> ratioFunc(int a, int b)
{
    pair<int, int> ret;
    if (a == 0)
    {
        ret.first = 0; ret.second = b;
    }
    else
    {
        int gc = gcd(abs(a),abs(b));
        a /= gc; b /= gc;
        ret.first = a; ret.second = b;
    }
    return ret;

}

int main()
{
    int a,b; cin >> a >> b;
    if (b == 0) {cout << "No answer";}
    else {auto res = ratioFunc(a,b); cout << "The ratio of " << a << " and " << b << " is " << res.first << ":" << res.second;}
}

Output :

500 700
The ratio of 500 and 700 is 5:7

Output (with negative integers):

-33 27
The ratio of -33 and 27 is -11:9

In case you haven't worked with pair yet, you can simply print immediately:

void ratioFunc(int a, int b)
{
    if (b == 0) {cout << "No answer";}
    else
    {

        if (a == 0) {cout << "The ratio of " << a << " and " << b << " is " << a << ":" << b; return; }

        int x = a, y = b; //Storing a,b for printing
        int gc = gcd(abs(a),abs(b));
        a /= gc; b /= gc;

        cout << "The ratio of " << x << " and " << y << " is " << a << ":" << b;
    }
}

As suggested by many pals here, you could use the gcd to find-and-devide steps in a loop untill the gcd is 1, but it may not be optimal.

I think an optimal algorithm would be factoring both numbers and remove the common factors, then multiply the remaining factors and print out them for each number.

A pseudocode would look like this:

1. input a and b
2. list a_factors := all factors of a
3. list b_factors := all factors of b
4. subprog: remove common elements in a_factors and b_factors
5. let a := multiplication of all remaining elements in a_factors
6. let b := multiplication of all remaining elements in b_factors
7. output a and b
Related