Largest proper fraction with sum of numerator and denominator equal to a given number
Last Updated :
16 Feb, 2023
We are provided with a number N. Find the biggest proper fraction a/b such that a + b = N. Following are constraints for fraction.
- a/b is a proper fraction if a<b and a and b are coprimes i.e no common factor of a and b.
- There can be multiple proper fractions with sum of numerator and denominator equal to a given number. The main task is to find the fraction having the maximum floating point value.
Examples:
Input : N = 3
Output : 1 2
Input : N = 12
Output : 5 7
Explanation: In the second example N = 12
Possible a and b's are: 1 11
5 7
But clearly 5/7 (=0.71..) is greater than
1/11 (=0.09..). Hence answer for N = 12
is 5 7.
The solution to this problem is more intuitive than algorithmic.
Consider the following points carefully to understand the formula presented later:
- A fraction has maximum value if numerator is as big as possible and the denominator is as small as possible.
- Here the constraints are the facts that numerator can’t be bigger than denominator and their sum should add up to N.
Keeping these two points in mind, we can get to the fact that answer to this problem will be ceil(n/2)-1 and floor(n/2)+1.
Now this solution will always work for odd N and all those even N whose (N/2) is even. This is due to the fact that these two cases will always generate coprimes with the above formula.
Now consider the following example:
N = 10
ceil(10/2)-1 = 4
floor(10/2)+1 = 6
Clearly 4 and 6 are the wrong answers as they are not coprimes. The correct answer is 3 and 7.
Hence for even N with odd (N/2) the formula becomes ceil(n/2)-2 and floor(n/2)+2.
C++
#include <iostream>
#include <cmath>
using namespace std;
void solve( int n)
{
float a = ( float )n / 2;
if (n % 2 != 0)
cout << ceil (a) - 1 << " "
<< floor (a) + 1 << endl;
else {
if (( int )a % 2 == 0) {
cout << ceil (a) - 1 << " "
<< floor (a) + 1 << endl;
}
else {
cout << ceil (a) - 2 << " "
<< floor (a) + 2 << endl;
}
}
}
int main()
{
int n = 34;
solve(n);
return 0;
}
|
Java
Python3
import math
def solve(n):
a = float (n / 2 );
if (n % 2 ! = 0 ):
print ((math.ceil(a) - 1 ),
(math.floor(a) + 1 ));
else :
if (a % 2 = = 0 ):
print ((math.ceil(a) - 1 ),
(math.floor(a) + 1 ));
else :
print ((math.ceil(a) - 2 ),
(math.floor(a) + 2 ));
n = 34 ;
solve(n);
|
C#
using System;
class GFG
{
public static void solve( int n)
{
double a = n / 2;
if (n % 2 != 0)
{
Console.WriteLine((Math.Ceiling(a) - 1) +
" " + (Math.Floor(a) + 1));
}
else
{
if (( int )(a) % 2 == 0)
{
Console.WriteLine((Math.Ceiling(a) - 1) +
" " + (Math.Floor(a) + 1));
}
else
{
Console.WriteLine((Math.Ceiling(a) - 2) +
" " + (Math.Floor(a) + 2));
}
}
}
public static void Main()
{
int n = 34;
solve(n);
}
}
|
PHP
<?php
function solve( $n )
{
$a = (float) $n / 2;
if ( $n % 2 != 0)
echo ceil ( $a ) - 1, " " ,
floor ( $a ) + 1, "\n" ;
else {
if ( $a % 2 == 0) {
echo ceil ( $a ) - 1, " " ,
floor ( $a ) + 1, "\n" ;
}
else {
echo ceil ( $a ) - 2, " " ,
floor ( $a ) + 2, "\n" ;
}
}
}
$n = 34;
solve( $n );
?>
|
Javascript
Output:
15 19
Time Complexity: O(1), the code will run in O(1) time.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...