Dividir un número en dos partes tal que la suma de sus dígitos sea máxima

Dado un número N. La tarea es encontrar el valor máximo posible de SumOfDigits(A) + SumOfDigits(B) tal que A + B = n (0<=A, B<=n).

Ejemplos: 

Input: N = 35
Output: 17
35 = 9 + 26
SumOfDigits(26) = 8, SumOfDigits(9) = 9
So, 17 is the answer.

Input: N = 7
Output: 7

Enfoque: La idea es dividir el número en dos partes A y B de modo que A esté en términos de 9, es decir, el número más cercano a N y B = NA. Por ejemplo, N = 35, el número más pequeño que está más cerca de 35 es 29. 

C++

// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
 
// Returns sum of digits of x
int sumOfDigitsSingle(int x)
{
    int ans = 0;
    while (x) {
        ans += x % 10;
        x /= 10;
    }
    return ans;
}
 
// Returns closest number to x in terms of 9's.
int closest(int x)
{
    int ans = 0;
    while (ans * 10 + 9 <= x)
        ans = ans * 10 + 9;
 
    return ans;
}
 
int sumOfDigitsTwoParts(int N)
{
    int A = closest(N);
    return sumOfDigitsSingle(A) + sumOfDigitsSingle(N - A);
}
 
// Driver code
int main()
{
    int N = 35;
    cout << sumOfDigitsTwoParts(N);
    return 0;
}

C

// C implementation of above approach
#include <stdio.h>
 
// Returns sum of digits of x
int sumOfDigitsSingle(int x)
{
    int ans = 0;
    while (x) {
        ans += x % 10;
        x /= 10;
    }
    return ans;
}
 
// Returns closest number to x in terms of 9's.
int closest(int x)
{
    int ans = 0;
    while (ans * 10 + 9 <= x)
        ans = ans * 10 + 9;
 
    return ans;
}
 
int sumOfDigitsTwoParts(int N)
{
    int A = closest(N);
    return sumOfDigitsSingle(A) + sumOfDigitsSingle(N - A);
}
 
// Driver code
int main()
{
    int N = 35;
    printf("%d",sumOfDigitsTwoParts(N));
    return 0;
}
 
// This code is contributed by kothavvsaakash.

Java

// Java implementation of above approach
// Returns sum of digits of x
import java.util.*;
import java.lang.*;
import java.io.*;
 
class GFG
{
static int sumOfDigitsSingle(int x)
{
    int ans = 0;
    while (x != 0)
    {
        ans += x % 10;
        x /= 10;
    }
    return ans;
}
 
// Returns closest number to x
// in terms of 9's.
static int closest(int x)
{
    int ans = 0;
    while (ans * 10 + 9 <= x)
        ans = ans * 10 + 9;
 
    return ans;
}
 
static int sumOfDigitsTwoParts(int N)
{
    int A = closest(N);
    return sumOfDigitsSingle(A) +
           sumOfDigitsSingle(N - A);
}
 
// Driver code
public static void main(String args[])
{
    int N = 35;
    System.out.print(sumOfDigitsTwoParts(N));
}
}
 
// This code is contributed by
// Subhadeep Gupta

Python3

# Python 3 implementation of above approach
 
#  Returns sum of digits of x
def sumOfDigitsSingle(x) :
    ans = 0
    while x :
        ans += x % 10
        x //= 10
 
    return ans
 
# Returns closest number to x in terms of 9's
def closest(x) :
    ans = 0
    while (ans * 10 + 9 <= x) :
        ans = ans * 10 + 9
 
    return ans
 
def sumOfDigitsTwoParts(N) :
    A = closest(N)
 
    return sumOfDigitsSingle(A) + sumOfDigitsSingle(N - A)
 
 
# Driver Code
if __name__ == "__main__" :
 
    N = 35
    print(sumOfDigitsTwoParts(N))
 
# This code is contributed by ANKITRAI1

C#

// C# implementation of above approach
// Returns sum of digits of x
 
using System;
class GFG
{
static int sumOfDigitsSingle(int x)
{
    int ans = 0;
    while (x != 0)
    {
        ans += x % 10;
        x /= 10;
    }
    return ans;
}
  
// Returns closest number to x
// in terms of 9's.
static int closest(int x)
{
    int ans = 0;
    while (ans * 10 + 9 <= x)
        ans = ans * 10 + 9;
  
    return ans;
}
  
static int sumOfDigitsTwoParts(int N)
{
    int A = closest(N);
    return sumOfDigitsSingle(A) +
           sumOfDigitsSingle(N - A);
}
  
// Driver code
public static void Main()
{
    int N = 35;
    Console.Write(sumOfDigitsTwoParts(N));
}
}

PHP

<?php
// PHP implementation of above approach
 
// Returns sum of digits of x
function sumOfDigitsSingle($x)
{
    $ans = 0;
    while ($x)
    {
        $ans += $x % 10;
        $x /= 10;
    }
    return $ans;
}
 
// Returns closest number
// to x in terms of 9's.
function closest($x)
{
    $ans = 0;
    while ($ans * 10 + 9 <= $x)
        $ans = $ans * 10 + 9;
 
    return $ans;
}
 
function sumOfDigitsTwoParts($N)
{
    $A = closest($N);
    return sumOfDigitsSingle($A) +
           sumOfDigitsSingle($N - $A);
}
 
// Driver code
$N = 35;
echo sumOfDigitsTwoParts($N);
 
// This code is contributed
// by inder_verma
?>

Javascript

<script>
 
// JavaScript implementation of above approach
 
// Returns sum of digits of x
function sumOfDigitsSingle(x)
{
    let ans = 0;
    while (x)
    {
        ans += x % 10;
        x = Math.floor(x / 10);
    }
    return ans;
}
 
// Returns closest number to x
// in terms of 9's.
function closest(x)
{
    let ans = 0;
     
    while(ans * 10 + 9 <= x)
        ans = ans * 10 + 9;
 
    return ans;
}
 
function sumOfDigitsTwoParts(N)
{
    let A = closest(N);
    return sumOfDigitsSingle(A) +
           sumOfDigitsSingle(N - A);
}
 
// Driver code
let N = 35;
 
document.write(sumOfDigitsTwoParts(N));
 
// This code is contributed by Surbhi Tyagi.
 
</script>
Producción: 

17

 

Complejidad de tiempo: O(log 10 N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por pawan_asipu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *