Спросите Волшебника #357
Используя каждую цифру от 1 до 9 ровно один раз, составьте три дроби, каждая из которых имеет одну цифру в числителе и две цифры в знаменателе, причем сумма этих трех дробей равна единице.
Например, 8/16 + 9/27 + 3/24 удовлетворяет всем условиям, за исключением того, что сумма равна 23/24, а не 1.
[spoiler=Решение]
Чтобы найти ответ, нужно перебрать 6,3,3,3,3,3 и перебрать 3 = 60 480 возможных перестановок. Должен признать, я пытался решить задачу методом проб и ошибок не более часа, но так и не нашел решения.
Итак, я написал программу для перебора всех фактов (9) = 362 880 способов упорядочить девять цифр и протестировал все из них. Самая сложная часть заключалась в том, чтобы перебрать все возможные способы упорядочить девять чисел. Вот как это сделать, используя лексографическую сортировку.
- Поместите все девять элементов в массив, расположив их от наименьшего к наибольшему.
- Найдите последний элемент в массиве, такой что следующий элемент будет больше. Если таких элементов не найдено, завершите программу.
- Начиная с элемента, следующего за элементом из шага 2, найдите последний элемент в массиве, который больше элемента из шага 2.
- Поменяйте местами элементы массива из шагов 2 и 3.
- Переверните элементы массива, начиная с шага 2 и до конца.
- Вернитесь к шагу 2.
Следуя этой процедуре, вы найдете правильный ответ шесть раз, по одному разу для всех шести способов упорядочивания трех дробей.
[spoiler=Код]
Я написал следующий код для сортировки каждой цифры от 1 до 9 в лексикографическом порядке и проверки каждого из них на предмет правильности решения.
void three_fraction(void)
{
int i, x_max, y_max, temp_array[100], hold, pt;
int lex_array[] = { 1,2,3,4,5,6,7,8,9 };
int num_elements = sizeof(lex_array) / sizeof(lex_array[0]);
int count = 0;
bool stop = false;
double tot3;
cerr << "Количество элементов =\t" << num_elements << "\n";
делать
{
count++;
tot3 = (double)lex_array[0] / (double)(10 * lex_array[1] + lex_array[2]);
tot3 += (double)lex_array[3] / (double)(10 * lex_array[4] + lex_array[5]);
tot3 += (double)lex_array[6] / (double)(10 * lex_array[7] + lex_array[8]);
если (tot3 == 1.0)
{
cerr << count << "\t";
cerr << lex_array[0] << "/" << lex_array[1] << lex_array[2] << " + ";
cerr << lex_array[3] << "/" << lex_array[4] << lex_array[5] << " + ";
cerr << lex_array[6] << "/" << lex_array[7] << lex_array[8] << "\n";
}
x_max = -1;
for (i = 0; i < (num_elements - 1); i++)
{
если (lex_array[i] < lex_array[i + 1])
x_max = i;
}
если (x_max >= 0)
{
y_max = 0;
for (i = x_max + 1; i < num_elements; i++)
{
если (lex_array[x_max] < lex_array[i])
y_max = i;
}
hold = lex_array[x_max];
lex_array[x_max] = lex_array[y_max];
lex_array[y_max] = hold;
если (x_max + 1 < num_elements - 1) // обратное преобразование
{
for (i = x_max + 1; i < num_elements; i++)
{
temp_array[i] = lex_array[i];
}
пт = 0;
for (i = x_max + 1; i < num_elements; i++)
{
lex_array[i] = temp_array[num_elements - 1 - pt];
пт++;
}
}
}
еще
стоп = true;
} while (stop == false);
}
[/спойлер]Этот вопрос задаётся и обсуждается на моём форуме, посвящённом игре Wizard of Vegas .
У одного человека была 10-галлонная бочка с вином и кувшин. Однажды он налил кувшин вина, а затем долил в бочку воды. Позже, когда вино и вода хорошо перемешались, он налил еще один кувшин и снова долил в бочку воды. В итоге в бочке оказалось равное количество вина и воды.
Каков был объём кувшина?
[spoiler=Решение]
Пусть j = объем кувшина.
После первого наполнения кувшина в нем осталось 10-j галлонов вина. После того, как вино было заменено водой, соотношение вина ко всему объему кега составило (10-j)/10.
После того, как из кувшина отчерпнули разбавленное вино, в кеге осталось 10-j галлонов разбавленного вина. Количество чистого вина в разбавленном вине можно выразить следующим образом:
(10-j)*((10-j)/10) = 5
(10-j)^2 = 50
j² - 20j + 100 = 50
j² - 20j + 50 = 0
j = (20 +/- sqrt(400-200))/2
j = (20 +/- 10*sqrt(2))/2
j = 10 +/- 5*sqrt(2)
Кувшин не может быть больше кега, поэтому мы должны использовать знак минус:
j = 10 - 5*sqrt(2) ≈ приблизительно 2,92893218813452 галлонов.
[/спойлер]Этот вопрос задаётся и обсуждается на моём форуме, посвящённом игре Wizard of Vegas .
Шестигранная игральная кость бросается снова и снова до тех пор, пока сумма выпавших чисел не станет равной 13 или больше. Чему равны среднее арифметическое, медиана и мода итогового результата?
Медиана = 14
Режим = 13
[spoiler=Решение]
Для этого мне пришлось использовать цепь Маркова. В следующей таблице показана вероятность каждого итогового значения в зависимости от суммы, указанной в левом столбце. Начнем с очевидных случаев для сумм от 13 до 18. Затем, для сумм от 0 до 12, возьмем среднее значение шести ячеек ниже.
Вероятности для начального состояния, сумма которых равна 0, можно найти в первой строке.
Цепь Маркова
| Сумма роллов | 13 | 14 | 15 | 16 | 17 | 18 |
|---|---|---|---|---|---|---|
| 0 | 0.279263 | 0.236996 | 0.192313 | 0.145585 | 0.097371 | 0.048472 |
| 1 | 0.290830 | 0.230791 | 0.188524 | 0.143842 | 0.097114 | 0.048899 |
| 2 | 0.293393 | 0.241931 | 0.181893 | 0.139625 | 0.094943 | 0.048215 |
| 3 | 0.289288 | 0.245178 | 0.193717 | 0.133678 | 0.091410 | 0.046728 |
| 4 | 0.280369 | 0.242560 | 0.198450 | 0.146988 | 0.086950 | 0.044682 |
| 5 | 0.268094 | 0.235687 | 0.197878 | 0.153768 | 0.102306 | 0.042267 |
| 6 | 0.253604 | 0.225827 | 0.193419 | 0.155611 | 0.111500 | 0.060039 |
| 7 | 0.360232 | 0.193566 | 0.165788 | 0.133380 | 0.095572 | 0.051462 |
| 8 | 0.308771 | 0.308771 | 0.142104 | 0.114326 | 0.081919 | 0.044110 |
| 9 | 0.264660 | 0.264660 | 0.264660 | 0.097994 | 0.070216 | 0.037809 |
| 10 | 0.226852 | 0.226852 | 0.226852 | 0.226852 | 0.060185 | 0.032407 |
| 11 | 0.194444 | 0.194444 | 0.194444 | 0.194444 | 0.194444 | 0.027778 |
| 12 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.166667 |
| 13 | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 14 | 0.000000 | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 15 | 0.000000 | 0.000000 | 1.000000 | 0.000000 | 0.000000 | 0.000000 |
| 16 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 0.000000 | 0.000000 |
| 17 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 0.000000 |
| 18 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 1.000000 |
Этот вопрос задаётся и обсуждается на моём форуме " Волшебник из Вегаса" .