给定整数N。该任务是查找在应用beow操作之后获得的中间值(包括N和1 )的最大可能和:
Divide N by any divisor (>1) until it becomes 1.
例子:
Input: N = 10
Output: 16
Initially, N=10
1st Division -> N = 10/2 = 5
2nd Division -> N= 5/5 = 1
Input: N = 8
Output: 15
Initially, N=8
1st Division -> N = 8/2 = 4
2nd Division -> N= 4/2 = 2
3rd Division -> N= 2/2 = 1
方法:由于任务是在每个步骤之后最大化值的总和,因此请尝试最大化单个值。因此,请尽可能减少N的值。为此,我们将N除以最小除数。
下面是上述方法的实现:
C++
// C++ implementation of the above approach
#include
using namespace std;
// Function to find the smallest divisor
int smallestDivisor(int n)
{
int mx = sqrt(n);
for (int i = 2; i <= mx; i++)
if (n % i == 0)
return i;
return n;
}
// Function to find the maximum sum
int maxSum(int n)
{
long long res = n;
while (n > 1) {
int divi = smallestDivisor(n);
n /= divi;
res += n;
}
return res;
}
// Driver Code
int main()
{
int n = 34;
cout << maxSum(n);
return 0;
}
Java
// Java implementation of the above approach
import java.io.*;
class GFG
{
// Function to find the smallest divisor
static double smallestDivisor(int n)
{
double mx = Math.sqrt(n);
for (int i = 2; i <= mx; i++)
if (n % i == 0)
return i;
return n;
}
// Function to find the maximum sum
static double maxSum(int n)
{
long res = n;
while (n > 1)
{
double divi = smallestDivisor(n);
n /= divi;
res += n;
}
return res;
}
// Driver Code
public static void main (String[] args)
{
int n = 34;
System.out.println (maxSum(n));
}
}
// This code is contributed by jit_t.
Python3
from math import sqrt
# Python 3 implementation of the above approach
# Function to find the smallest divisor
def smallestDivisor(n):
mx = int(sqrt(n))
for i in range(2, mx + 1, 1):
if (n % i == 0):
return i
return n
# Function to find the maximum sum
def maxSum(n):
res = n
while (n > 1):
divi = smallestDivisor(n)
n = int(n/divi)
res += n
return res
# Driver Code
if __name__ == '__main__':
n = 34
print(maxSum(n))
# This code is contributed by
# Surendra_Gangwar
C#
// C# implementation of the above approach
using System;
class GFG
{
// Function to find the smallest divisor
static double smallestDivisor(int n)
{
double mx = Math.Sqrt(n);
for (int i = 2; i <= mx; i++)
if (n % i == 0)
return i;
return n;
}
// Function to find the maximum sum
static double maxSum(int n)
{
long res = n;
while (n > 1)
{
double divi = smallestDivisor(n);
n /= (int)divi;
res += n;
}
return res;
}
// Driver Code
public static void Main()
{
int n = 34;
Console.WriteLine(maxSum(n));
}
}
// This code is contributed by Ryuga.
PHP
1)
{
$divi = smallestDivisor($n);
$n /= $divi;
$res += $n;
}
return $res;
}
// Driver Code
$n = 34;
echo maxSum($n);
#This code is contributed by akt_mit.
?>
输出:
52
时间复杂度: O(sqrt(n)* log(n))