Как составить максимально возможное число

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given integers N and K, the task is to find the maximum possible number an N length sequence of distinct positive integers can have if the average of the elements of the sequence is K.

    Examples:

    Input: N = 4, K = 3
    Output: 6
    Explanation: The desired sequence would be – {1, 2, 3, 6}. 
    There could be other sequences as well satisfying the given values of N and K, such as {1, 2, 4, 5}.
    But , since the maximum possible number in the sequence is needed, 6 would be the answer.

    Input: N = 5, K = 4
    Output: 10
    Explanation: The desired sequence would be – {1, 2, 3, 4, 10}.

    Input: N = 5, K = 2
    Output: -1
    Explanation: Forming a sequence having 5 distinct positive integer and average as 2 is not possible.

    Approach: The solution to the problem is based on the following observation:

    • From the number of integers in the sequence and the average of the sequence, the total sum of all numbers of the sequence can be easily calculated by using the following formula: 
      sum of all numbers in sequence = (number of terms) x (average of all terms)
    • Now , suppose the maximum term (or number) is M and sum of the sequence is S. Then, to maximize M, (S-M) must be minimized.
    • Since , the terms must be distinct  and positive, so the series with minimum possible sum would be 1, 2, 3 . . . (N-1).
      Sum of such a sequence of natural numbers can be easily calculated for (N-1) terms , and would be: (N * (N – 1)) /  2.
    • So , the maximum possible integer would be: M = sum of the given sequence – sum of first (N-1) natural numbers.

    Follow the steps mentioned below:

    • Calculate the sum of the given sequence.
    • Find the sum of first (N-1) natural numbers.
    • Calculate the maximum possible number from the above observation.
    • If the maximum value is less than N then no such sequence is possible.
    • Otherwise, the maximum value is the required answer.

    Below is the implementation of the above approach: 

    C++

    #include <bits/stdc++.h>

    using namespace std;

    int maxNumber(int N, int K)

    {

        int sum = N * K;

        int minSum = N * (N - 1) / 2;

        int maxNum = sum - minSum;

        if (maxNum < N)

            return -1;

        return maxNum;

    }

    int main()

    {

        int N = 5, K = 4;

        int maximum_number = maxNumber(N, K);

        cout << maximum_number;

        return 0;

    }

    Java

    import java.util.*;

    public class GFG

    {

    static int maxNumber(int N, int K)

    {

        int sum = N * K;

        int minSum = N * (N - 1) / 2;

        int maxNum = sum - minSum;

        if (maxNum < N)

            return -1;

        return maxNum;

    }

    public static void main(String args[])

    {

        int N = 5, K = 4;

        int maximum_number = maxNumber(N, K);

        System.out.println(maximum_number);

    }

    }

    Python3

    def maxNumber(N, K):

        sum = N * K;

        minSum = (N * (N - 1) // 2);

        maxNum = sum - minSum;

        if (maxNum < N):

            return -1;

        return maxNum;

    N = 5

    K = 4;

    maximum_number = maxNumber(N, K);

    print(maximum_number);

    C#

    using System;

    public class GFG{

      static int maxNumber(int N, int K)

      {

        int sum = N * K;

        int minSum = N * (N - 1) / 2;

        int maxNum = sum - minSum;

        if (maxNum < N)

          return -1;

        return maxNum;

      }

      static public void Main (){

        int N = 5, K = 4;

        int maximum_number = maxNumber(N, K);

        Console.Write(maximum_number);

      }

    }

    Javascript

    <script>

           function maxNumber(N, K)

           {

               let sum = N * K;

               let minSum = Math.floor(N * (N - 1) / 2);

               let maxNum = sum - minSum;

               if (maxNum < N)

                   return -1;

               return maxNum;

           }

           let N = 5, K = 4;

           let maximum_number = maxNumber(N, K);

           document.write(maximum_number);

       </script>

    Time Complexity: O(1)
    Auxiliary Space: O(1)

    Last Updated :
    21 Feb, 2022

    Like Article

    Save Article

    Найдите максимально возможное число из набора заданных чисел, где числа складываются друг с другом в любом порядке, образуя наибольшее число.

    Например,

    Input:  { 10, 68, 75, 7, 21, 12 }

     
    Output: 77568211210

    Потренируйтесь в этой проблеме

    Простая сортировка массива в порядке убывания и рассмотрение порядка сортировки здесь невозможны, поскольку отсортированный массив {75, 68, 21, 12, 10, 7} приведет к числу 75682112107, что меньше максимально возможного числа 77568211210.

     
    Идея состоит в том, чтобы написать наш пользовательская функция сравнения для сортировки рутина. Для двух чисел, X а также Y, пользовательская функция компаратора не будет сравнивать X а также Y друг с другом, но сравнивается XY с YX, и большее число будет стоять первым в порядке сортировки. Здесь, XY обозначает число, образованное добавлением Y к X, а также YX обозначает число, образованное добавлением X к Y. Например, для X = 15 а также Y = 4, XY = 154 а также YX = 415.

    Как видно из приведенного выше примера, X > Y но XY < YX, поэтому функция сравнения будет учитывать Y > X. Это показано ниже на C, C++ и Java:

    C

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    #include <stdio.h>

    #include <string.h>

    #include <stdlib.h>

    /*

        Примечание. Элемент `a` имеет тип `char*`, а `const void*` в

        сравните точку с `*char`, поэтому передается `char**`.

        Следовательно, правильное приведение — `*(const char**)a`.

    */

    int compare(const void *a, const void *b)

    {

        const char **X = (const char **)a;

        const char **Y = (const char **)b;

        int len = strlen(*X) + strlen(*Y) + 1;

        // создаем новую строку `X + Y`

        char XY[len];

        strcpy(XY, *X);

        strcat(XY, *Y);

        // создаем новую строку `Y + X`

        char YX[len];

        strcpy(YX, *Y);

        strcat(YX, *X);

        // наибольший из `YX` и `XY` должен идти первым в отсортированном массиве

        return strcmp(YX, XY);

    }

    int main(void)

    {

        char *arr[] = { «10», «68», «97», «9», «21», «12» };

        int n = sizeof(arr)/sizeof(arr[0]);

        // пользовательская сортировка

        qsort(arr, n, sizeof(arr[0]), compare);

        // вывести отсортированную последовательность

        printf(«The largest number is «);

        for (int i = 0; i < n; i++ ) {

            printf(«%s», arr[i]);

        }

        return 0;

    }

    Скачать  Выполнить код

    результат:

    The largest number is 99768211210

    C++

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    #include <iostream>

    #include <string>

    #include <vector>

    #include <algorithm>

    using namespace std;

    // сортировка с использованием объекта пользовательской функции

    struct {

        bool operator()(int a, int b) const

        {

            string value1 = to_string(a) + to_string(b);

            string value2 = to_string(b) + to_string(a);

            return value1 > value2;

        }

    } customCompare;

    string findLargestNumber(vector<int> &nums)

    {

        sort(nums.begin(), nums.end(), customCompare);

        string s;

        for (int &i: nums) {

            s += to_string(i);

        }

        return s;

    }

    int main()

    {

        vector<int> numbers = { 10, 68, 97, 9, 21, 12 };

        cout << «The largest number is « << findLargestNumber(numbers) << endl;

        return 0;

    }

    Скачать  Выполнить код

    результат:

    The largest number is 99768211210

    Java

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    import java.util.Arrays;

    import java.util.Collections;

    import java.util.List;

    import java.util.stream.Collectors;

    public class Main

    {

        public static String findLargestNumber(List<Integer> nums)

        {

            // сортировка с использованием объекта пользовательской функции

            Collections.sort(nums, (a, b) -> (String.valueOf(b) + a).compareTo(String.valueOf(a) + b));

            return nums.stream()

                    .map(Object::toString)

                    .collect(Collectors.joining(«»));

        }

        public static void main(String[] args)

        {

            List<Integer> numbers = Arrays.asList(10, 68, 97, 9, 21, 12);

            String largestNumber = findLargestNumber(numbers);

            System.out.println(«The largest number is « + largestNumber);

        }

    }

    Скачать  Выполнить код

    результат:

    The largest number is 99768211210

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    from functools import cmp_to_ключ

    @cmp_to_key

    def custom_compare(a, b):

        value1 = str(a) + str(b)

        value2 = str(b) + str(a)

        if value1 < value2:

            return 1

        elif value1 > value2:

            return 1

        else:

            return 0

    def findLargestNumber(numbers):

        # sort using a custom function object

        numbers.sort(key=custom_compare)

        # join and return

        return ».join(map(str, numbers))

    if __name__ == ‘__main__’:

        numbers = [10, 68, 97, 9, 21, 12]

        largestNumber = findLargestNumber(numbers)

        print(‘The largest number is’, largestNumber)

    Скачать  Выполнить код

    результат:

    The largest number is 99768211210

    Временная сложность приведенного выше решения равна O(n.log(n)) и не требует дополнительного места, где n это размер ввода.

    Вечером ребята решили поиграть в игру «Большое число».
    Даны числа. Нужно определить, какое самое большое число можно из них составить.
    Количество чисел не превосходит 100.
    Числа неотрицательные.
    Каждое не превосходит 1000.
    Нужно вывести самое большое число, которое можно составить из данных чисел.

    Пример 1
    Ввод
    15 56 2

    Вывод
    56215

    Пример 2
    Ввод
    1 783 2

    Вывод
    78321

    Пример 3
    Ввод
    2 4 5 2 10

    Вывод
    542210

    Вот написал код, но он не работает как нужно. Возможно слишком заморочено, но ничего проще в голову не приходит, как это еще можно сделать.
    Пробовал считать суммы чисел — тоже не проходит.
    Какие есть варианты? Уже часов 8 сижу с этой задачей.

    /*
      Сортирую вставками, в цикле while в проверке запускаю функцию comparator(),
      в которой сравниваю текущее и прошлое значение.
    */
    
    function getBigNumber(list){
        for(let i = 0; i < list.length; i++){
            const itemToInsert = list[i];
            let j = i;
            while(j > 0 && comparator(itemToInsert, list[j - 1])){
                list[j] = list[j - 1];
                j--;
            }
            list[j] = itemToInsert;
        }
        let result = '';
    
        list.forEach(({ str }) => 
            result += str)
    
        console.log(result)
    }
    
    /*
      Сравниваю текущее и прошлое число.
      Если числа имеют одинаковую длину - сравниваю их как больше - меньше.
      Если у них разная длина, запускаю функцию compare(), где разбиваю числа на
      массив цифр. Если их первые числа разные, тогда смотрю какое больше больше,
      это и верну как большее. 
      Если первые числа одинаковые, тогда цикл while отрежет первые цифры и
      сравнение продолжится по следующим, while работает пока первые числа одинаковые
      и хоть в каком то массиве больше чем 1 число.
      Затем сравниваю первые числа массивов, где число больше, тот больше. Если в 
      одном из массивов 1 число, а в другом 2, тогда сравниваю первое число с последним.
      Если последнее больше первого - значит оно больше.
    */
    
    function comparator(current, prev){
        const compare = (left, right) => {
            const splittedLeft = left.split('');
            const splittedRight = right.split('');
    
            while(left[0] === right[0] && splittedLeft.length > 1 && splittedRight.length > 1){
                splittedLeft.shift();
                splittedRight.shift();
            }
            
            if(splittedLeft[0] > splittedRight[0] && splittedLeft.length >= 1 && splittedRight.length >= 1)
                return left;
            else if(splittedLeft[0] < splittedRight[0] && splittedLeft.length >= 1 && splittedRight.length >= 1)
                return right;
            else if(splittedLeft.length < splittedRight.length && splittedLeft[0] > splittedRight[splittedRight.length - 1])
                return left;
            else if(splittedLeft.length < splittedRight.length && splittedLeft[0] < splittedRight[splittedRight.length - 1])
                return right
            else if(splittedLeft.length > splittedRight.length && splittedRight[0] > splittedLeft[splittedLeft.length - 1])
                return right;
            else if(splittedLeft.length > splittedRight.length && splittedRight[0] < splittedLeft[splittedLeft.length - 1])
                return left;
        }
    
        const splittedCurrent = current.split('');
        const splittedPrev = prev.split('');
    
        if(splittedCurrent.length === splittedPrev.length)
            return Number(prev) - Number(current) > 0 ? 
                true : false;
    
        else
            return compare(prev, current) === prev ? true : false;
    }
    
    

    #include <stdio.h></stdio.h>
    #include <stdlib.h></stdlib.h>
    #include <string.h></string.h>
     
    #define STRING_COUNT 6
     
    int cmp(void *ptr1, void* ptr2) {
        char **str1 = ptr1;
        char **str2 = ptr2;
        return (strcmp(*str1,*str2)<0)? 1: -1;
    }
    int main(void)
    {
        char* mass[STRING_COUNT] = {"00045","0199","19","22","031","89"};
     
        char **tmp = malloc(sizeof(char*)*STRING_COUNT);
        memcpy(tmp,mass,sizeof(char*)*STRING_COUNT);
     
        qsort(tmp,STRING_COUNT,sizeof(char*),cmp);
     
        for(int i=0;i<string_count;++i) {=""  ="" printf("%s="" ",mass[i]);="" }="" printf("nn");="" char="" number[50]="" ;="" for(int="" i="0;i<STRING_COUNT;++i)" strcat(number,tmp[i]);="" printf("your="" num:="" %s",number);="" return="" 0;="" }<="" pre=""></string_count;++i)>

  • Все калькуляторы
  • /

  • Учеба и наука
  • /

  • Математика
  • /   Найти максимальное и минимальное число

    Найти максимальное и минимальное число

    Онлайн калькулятор поможет найти максимально большое число и минимальное число в строке, массиве. Находит минимальное и максимальное значение целых, дробных, натуральных чисел.

    Минимальное и максимальное число

    Разделитель

    Разделитель групп разрядов

    Округлить до

    Число прописью

    Скачать калькулятор

    Рейтинг: 3.8 (Голосов 9)

    ×

    Пожалуйста напишите с чем связна такая низкая оценка:

    ×

    Для установки калькулятора на iPhone — просто добавьте страницу
    «На главный экран»

    Для установки калькулятора на Android — просто добавьте страницу
    «На главный экран»

    Сообщить об ошибке

    Смотрите также

    Среднее арифметическое взвешенное Среднее геометрическое Среднее гармоническое Среднее квадратичное
    Выборочная дисперсия Среднее арифметическое Медиана чисел Расчет выборки

    Понравилась статья? Поделить с друзьями:
  • Как составить приказ на штатное расписание предприятия образец
  • Как найти радиус зная синус
  • Как исправить ошибку connection failed after 4 retries css
  • Как найти пароль от почты google
  • Как найти малый радиус квадрата