C++ find four factors of N with maximum product and sum equal to N .

Concept

With respect of a given integer N, our task is to determine all factors of N print the product of four factors of N so that −

• The sum of the four factors is equal to N.
• The product of the four factors is largest.

It has been seen that if it is impossible to find 4 such factors then print “Not possible”.

It should be noted that all the four factors can be equal to each other to maximize the product.

Input

24

Output

All the factors are -> 1 2 4 5 8 10 16 20 40 80
Product is -> 160000

Select the factor 20 four times,

Therefore, 20+20+20+20 = 24 and product is maximum.

Method

Following is the step by step algorithm to solve this problem −

• At first determine the factors of a number ‘N’ by visiting from 1 to square root of ‘N’ and verify if ‘i’ and ‘n/i’ divides N and store them in a vector.
• Now we sort the vector and print every element.
• Determine three numbers to maximize the product with the fourth number, implementing three loops.
• Finally we replace the next maximum product with the previous product.
• Print the product when you’ll find the four factors.

Example

Live Demo

// C++ program to find four factors of N
// with maximum product and sum equal to N
#include <bits/stdc++.h>
using namespace std;
// Shows function to find factors
// and to print those four factors
void findfactors2(int n1){
vector<int> vec2;
// Now inserting all the factors in a vector s
for (int i = 1; i * i <= n1; i++) {
if (n1 % i == 0) {
vec2.push_back(i);
vec2.push_back(n1 / i);
}
}
// Used to sort the vector
sort(vec2.begin(), vec2.end());
// Used to print all the factors
cout << "All the factors are -> ";
for (int i = 0; i < vec2.size(); i++)
cout << vec2[i] << " ";
cout << endl;
// Now any elements is divisible by 1
int maxProduct2 = 1;
bool flag2 = 1;
// implementing three loop we'll find
// the three maximum factors
for (int i = 0; i < vec2.size(); i++) {
for (int j = i; j < vec2.size(); j++) {
for (int k = j; k < vec2.size(); k++) {
// Now storing the fourth factor in y
int y = n1 - vec2[i] - vec2[j] - vec2[k];
// It has been seen that if the fouth factor become negative
// then break
if (y <= 0)
break;
// Now we will replace more optimum number
// than the previous one
if (n1 % y == 0) {
flag2 = 0;
maxProduct2 = max(vec2[i] * vec2[j] * vec2[k] *y,maxProduct2);
}
}
}
}
// Used to print the product if the numbers exist
if (flag2 == 0)
cout << "Product is -> " << maxProduct2 << endl;
else
cout << "Not possible" << endl;
}
// Driver code
int main(){
int n1;
n1 = 80;
findfactors2(n1);
return 0;
}

Output

All the factors are -> 1 2 4 5 8 10 16 20 40 80
Product is -> 160000