Получить число в интервале

Я хотел бы получить число от 5 до 250 из двух переменных в соответствии со следующим псевдокодом:

arg[1-19] * something = [5 - 250]

arg будет содержать значения (целые числа) в интервале [1 - 19]; something может быть любым целым числом.

Проблема в том, что я получаю тот же результат, используя разные комбинации arg и something:

arg: 1, something: 10 => result 10
arg: 2, something:  5 => result 10

Как я могу убедиться, что результат будет разным для любой пары arg и something?

Есть ли в Java математическая функция или функция для этого?

Может помочь увидеть фрагмент кода.

Yassin Hajaj 30.03.2018 14:08

Ваш вопрос действительно непонятный. Ваш результат правильный, потому что вы делаете 1*10 или 2*5, что приведет к 10. Так в чем же ваша проблема?

vincrichaud 30.03.2018 14:09

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

JB Nizet 30.03.2018 14:10

Ваше "что-то" может быть (int)((new Random().nextInt(251) + 5) / arg), где arg - любой аргумент (в диапазоне 1-19).

JedaiCoder 30.03.2018 14:21

@JedaiCoder Пожалуйста, не смейтесь надо мной (я понятия не имею о Java и не знаю, что делает nextInt()), но, похоже, что-то не так с вашим кодом. Предположим, что arg = 1, тогда ваш код теоретически может дать 255, не так ли?

Binarus 30.03.2018 14:54

Я голосую за повторное открытие этого вопроса. ИМХО, совершенно ясно, что он спрашивает: есть ли способ получить число от 5 до 250 путем умножения двух других чисел, когда одно из других чисел находится между 1 и 19, так что каждая другая пара другого числа дадут другой результат?

Binarus 30.03.2018 19:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
565
3

Ответы 3

Если something может принимать больше значений 12, это невозможно, так как ваше входное пространство будет иметь размер не менее 19 * 13 = 247, тогда как ваше выходное пространство имеет размер 245.

Если something принимает значения меньше, чем 12, вы можете просто сделать: 19 *$something + arg + 4, предполагая, что вы сопоставляете значения something с интервалом [0,n].

Проголосовали за рассмотрение размера входного пространства ...

Binarus 30.03.2018 15:21

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

(1) a * b = C

для любого (произвольно выбранного) C, где a, b и C являются целыми числами.

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

Предположим, что a не является простым (доказательство будет таким же, если b не является простым). Тогда должно быть как минимум два целых числа p и a' (p не является одним по определению), чтобы

(2) a = p * a'

Теперь определим, что

(3) b' = p * b

Используя уравнения (2) и (3), вы можете переставить уравнение (1) следующим образом:

(4) C = a * b = (p * a') * b = a' * (p * b) = a' * b'

q.e.d

Здесь начиная с p != 1 (по определению - см. Выше), a != a' и b != b'.

Это означает, что у вас должны быть оба множителя a, b, если вы хотите гарантировать, что каждая пара (a, b) даст другой результат a * b.

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

Например, если бы мы знали, что ваш something всегда меньше десяти (т. Е. 0, 1, ..., 9), вы могли бы использовать (arg * 10) + something (это только пример, демонстрирующий принцип; он дал бы значения между 10 и 199, учитывая ограничение для arg, которое у вас есть. упомянуто, поэтому на самом деле это не решение вашей проблемы; я выбрал эти числа, потому что наша десятичная система в основном работает именно так :-) и, следовательно, вы уже знаете об этом).

И, наконец, настолько тривиально, что это, возможно, не приходит в голову, вспомните, что a * b = b * a (умножение коммутативно, по крайней мере, для наших целых, действительных и иррациональных чисел и некоторых других, о которых я не смею упоминать). Применительно к вашей проблеме: arg * something = something * arg. Конечно, это все еще верно, даже если arg и something оба являются простыми. Вы неизбежно получите тот же результат, если поменяете значения arg и something. Это может быть приемлемым или неприемлемым для того, чего вы пытаетесь достичь.

Если ваша цель состоит в том, чтобы дать число "аргумент", вы возвращаете число "что-то", так что результат arg*something соответствует заданному интервалу, попробуйте следующее:

public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(findNumber(2, 5, 250));
    }

public static int findNumber(int arg, int min, int max) {
    Random rand = new Random();
    int randMin;
    int randMax;
    if (min%arg == 0){
        randMin = min/arg;
    } else {
        randMin = (min / arg) + 1;
    }
    randMax = max/arg;
    int result = rand.nextInt(randMax+1-randMin);
    result = result + randMin;
    return result;
}

Другие вопросы по теме