2013-09-13 2 views
1

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

Я сожалею о запутанном названии, позвольте мне прояснить мою проблему:

Моя программа Java должна задать математический вопрос с процентами.

Это должно создать вопрос в этом формате:

25% of 4616 = ? 

требования являются:

  • процент всегда делимые на 5 (без проблем)
  • число (здесь 4616) должен быть между 100 и 9999 (также не проблема)
  • номер, а также результат должен быть целым числом (это моя проблема)

Есть ли быстрый способ найти случайное число, которое соответствует последнему требованию?

Единственное решение, которое я могу думать о том, чтобы найти процент, а затем создать цикл, который не остановится, пока случайное число не найдено, которая удовлетворяет требованию (в данном примере до number % 4 == 0 верно)

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

Есть ли лучший способ для моей проблемы?

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

т.д .: Если мой процент составляет 65%, то возможно вопрос будет

65% от 7620 =?

потому что решение 4953 также целое число.

Я хочу найти случайное число между 100 и 9999, которое представляет собой целое число И имеет в результате целое число в уравнение p * x = y.

+0

@sbat это не сработает, процентное значение не совпадает с делением. Пример: 94 * 95 = 8930, но 8930 * 0,95 = 8483,5 (double, no integer) – Lotzki

ответ

1

Пусть p - это процентное значение (числитель, то есть 25%), x по начальному значению и y - целое число.

Поскольку p представляет собой процент, который является кратным 5 и от 0 to 100 то можно представить его как p = 5a/100 = a/20, где 0 <= a <= 20.

Для x у нас есть ограничение, что 100 <= x <= 999.

Сначала выберите a, который удовлетворяет 0 <= a <= 20.

Далее мы выбираем x. Ну, для p * x = (a/20) * x, чтобы быть целым результатом, нам просто нужно разделить a * x. Ну, мы знаем, что 20 | (a * x) («20 делит * х») тогда и только тогда, когда

j = (a * x)/20 (<- j is some integer) 
<=> j = (a * x)/(2^2 * 5^1) 

Поскольку мы имеем a мы можем заменить его на простые множители:

j = (p1^e1 * p2^e2 * ... * pn^en) * x/(2^2 * 5^1) 

Теперь понимаю, что a составляет менее 20, поэтому простое факторизация, вероятно, довольно проста и, вероятно, «перекрывается» с простой факторизацией. Например, если a = 5 то вышеприведенное уравнение упрощается

j = x/4 

В этом случае легко видеть, как мы можем генерировать x, который будет производить целое j (кратные 4. Хотя вам нужно 100 <= x <= 9999 тоже!). Таким образом, «перекрывающиеся» (т. Е. Простые множители в числителе, которые совпадают с знаменателем), являются очень выгодными. Именно здесь вступает в игру наибольший общий делитель.GCD(a, 20) - наибольшее целое число, которое делит a и 20. Первичная факторизация GCD - это как раз перекрытие. Он также имеет приятное свойство, что после того, как мы «удалить» Перекрытие, полученные значения:

j = b * x/c 

Есть приятное свойство, что b и c взаимно просты. Из этого мы знаем, что b * x/c является целым числом тогда и только тогда, когда c | x.

Таким образом, пусть GCD(a, 20) = k. Затем по определению имеем a/k = b и 20/k = c, поэтому a/20 = b/c. Поэтому пусть x = c * m, где m является целым числом. Тогда мы имеем:

100 <= m * c <= 9999 
=> 100/c <= m <= 9999/c 

Таким образом, мы можем сделать floor(rand(100/c, 9999/c)) производить свой m.

Резюмируя:

a = rand(0, 20) 
p = 5*a 
c = 20/GCD(a, 20) 
m = floor(rand(100/c, 9999/c)) 
x = c * m 
y = (p/100) * x 

Обратите внимание, что a = 0 на самом деле крайний случай, и, кроме того, floor() не даст вам полностью равномерное распределение. Если вам нужно, чтобы они были закрыты, я, вероятно, подумаю об этом и немного подберу ответ. Кроме того, алгоритм Евклида тривиальен для реализации, вы можете его найти. Heck, так как a < 20 вы могли бы, вероятно, просто жёстко функцию :)

редактировать Я забыл определить c в моем резюме в первый раз до конца. Вот пример, чтобы произвести контрпример вы имели ниже:

a = 5 
p = 25 
c = 20/GCD(5, 20) = 20/5 = 4 
m = some integer in [25, 2500). In this case so we randomed 879 
x = 3516 
y = 879 

Удобно в этом примере мы имеем GCD(a, 20) = 5 так получается, что m = y, но это не всегда так.

+0

Спасибо, самым большим общим делителем был недостающий кусок, о котором я думал! Я приму этот ответ, хотя код был немного запутанным и не работал корректно с моей проблемой. Но gcd сделал трюк, посмотри на мой ответ. – Lotzki

+0

@ Lotzki Это было немного запутанно, но это было просто алгебраическое манипулирование, чтобы получить формулы как можно проще. (Я хотел показать, что вы можете использовать ограничения алгебры + и получить ответ). Я забыл опубликовать определение 'c' в своем резюме, и я также забыл разделить' p' на 100. Я добавил это, а также пример, чтобы показать вам, что формулы должны работать. Глядя на ваш ответ, у вас почти одинаковые вычисления, как указано выше (хотя вы использовали разные обозначения), но у вас был 'y = floor (x * a/20)'. Обратите внимание, что 'a/20 = 5a/100 = p/100', что у меня есть сейчас :) – rliu

1

я бы просто выбрать процент и работать в обратном направлении от ответа, чтобы прибыть на вопрос:

p * x = answer | 0 < p < 100, p = 5k, 100 <= x < 10000 

Итак, забрать свой процент:

p = (5 * rand(1, 9))/100.0; 

Убедитесь, что ваш 100 <= answer/p < 10000:

answer = rand(100, p * 9999); 

Решите для 'unknown':

x = p/y 
+0

Это не решит мою проблему, я попытался прояснить свою проблему в моем исходном вопросе – Lotzki

+0

@Lotzki Упс, процент расчет действительно ошибочен. Будет редактировать, чтобы исправить это. Это должно быть единственной проблемой, хотя (кроме псевдокода) – Corbin

+0

Опять же, это только математическое уравнение, это не решит мою проблему. См. Мой ответ и принятый ответ – Lotzki

1

Вы правы, делитель зависит от значения p. Таким образом, выбрать p первый, а затем использовать ее для вычисления делителя, чтобы выбрать случайное число в диапазоне:

For 5% it should be dividable by 20 (5/100 = 1/20) 
For 10% it should be dividable by 10 (10/100 = 1/10) 
For 15% it should be dividable by 20 (15/100 = 3/20) 
For 20% it should be dividable by 5 (20/100 = 1/5) 
For 25% it should be dividable by 4 (25/100 = 1/4) 
For 30% it should be dividable by 10 (30/100 = 3/10) 
... 

Вы можете вычислить его за счет уменьшения доли p/100 и собирание знаменатель

ниже ответ является не правильно

Похоже, вы должны выбрать номера из диапазона 100-9999 которые делимые на 20.

answer = x * p/100 = x * k/20 (since p is dividable by 5) 
k = rand(1,494) 
x = 100 + 20*k 
p = 5*rand(1,20) 
+0

Да, я тоже подумал об этом, но это не будет охватывать все возможные решения. – Lotzki

+0

@ Lotzki можете ли вы считать любой пример, который не покрыт? –

+0

Уверен: 25% из 3516 = 879. Не делятся на 20, но правильно – Lotzki

0

Хорошо, спасибо roliu Я наконец нашел решение. Это как мое окончательное решение выглядит следующим образом:

Создать случайное число в диапазоне от 1 до 20 (из-за процент разделяемая на 5):

a = rand(1,20) 

Найти наибольший общий делитель:

b = gcd(a,20) 

Создайте случайное число в диапазоне, разделенном на 20/gcd (см. Ответ denis, если вы не знаете почему):

c = rand(floor(100/(20/b)),floor(9999/(20/b))) 

Умножить случайное число на 20/НОД, чтобы получить число в диапазоне, наш X:

x = floor(c * (20/b)) 

умножить число на процент, чтобы получить решение у:

y = floor(x * (a/20)) 

Преобразование процент правильное значение для печати:

p = a * 5 

Окончательное уравнение:

p % of x = y 
Смежные вопросы