Задача про банковскую комиссию

Задача про банковскую комиссию

Основано на реальных событиях

Пятница — время дурных математических задач. 

Один вебмастер сделал сайт для зарубежной компании и получил гонорар в долларах. Но когда сумма поступила, в банковском отчёте он увидел такую же сумму, но в рублях. Когда он обратился в банк с вопросом, почему так, ему объяснили:

«Банк конвертирует доллары в рубли по текущему курсу банка — 48,5 рубля за доллар. После этого берёт комиссию за перевод — 3% от суммы, но не менее 15 000 рублей. Так как перевод был хоть и в долларах, но на рублёвую карточку, банк взял минимальную рублёвую комиссию. А ещё банк не может взять комиссию больше, чем сам перевод».

Вопрос: сколько заплатила зарубежная компания вебмастеру в долларах, если он получил столько же, но рублей (например, если сайт стоил 200 долларов, то вебмастер получил на счёт 200 рублей)? Чтобы было проще, можно пренебречь копейками и центами.

Чтобы не усложнять решение и не строить сложные формулы и уравнения, используем силу машин: напишем код, который сам проверит все условия и подберёт подходящий ответ.

Сначала опишем все переменные, которые нам понадобятся для решения:

// размер перевода в долларах и результат в рублях
// для простоты допустим, что минимальный перевод — 1 доллар
var income = 1;
var roubles;

// размер обычной и минимальной комиссии
const fee = 0.03;
const fee_min = 15000;

// курс доллара
const usd = 48.5;

Теперь сделаем функцию, которая имитирует перевод из-за рубежа: она пересчитывает всё в рубли, считает комиссию и возвращает сумму в рублях, которая останется после перевода:

// обрататываем перевод
function swift(income) {
    // переменная для расчёта комиссии
    var tax;
    // сумма в рублях
    var income_roubles;
    // переводим в рубли
    income_roubles = income * usd;
    // считаем комиссию в процентах
    tax = income_roubles * fee;
    // если она меньше минимальной
    if (tax < fee_min) {
        // то берём минимальную комиссию
        tax = fee_min;
    }
    // если комиссия больше поступившей суммы 
    if (tax > income_roubles) {
        // то берём саму сумму
        tax = income_roubles;
    }
    // результат функции — остаток в рублях
    return(income_roubles - tax);
}

Последнее, что осталось сделать, — проверить, равны ли числа в рублях и долларах. По условию мы можем отбросить копейки и центы — используем для этого функцию toFixed(0). Она откинет всё, что после точки, а результат вернёт в виде строки.

// пока сумма в долларах не сравняется с рублёвым остатком
while (income.toFixed(0) != roubles.toFixed(0)) {
    // увеличиваем размер перевода на один доллар
    income += 0.1;
    // и получаем рублёвый остаток на счету
    roubles = swift(income);
    // если сайт стоит больше миллиона долларов — отказываемся от разработки
    if (income > 1000000) {break;}
}

Чтобы увидеть результат, используем команду console.log(income.toFixed(1)); — она выведет сумму в долларах с точностью до одного знака после запятой. Если эту сумму отправить переводом, то по условиям банка на счету мы получим ту же самую сумму в рублях (без учёта копеек и центов, конечно).

if (income < 1000000) {
    console.log(income.toFixed(1));
} else { 
    console.log('Сумма превысила доступный бюджет');
    }

Теперь соберём код в одно целое и запустим в консоли:

// размер перевода в долларах и результат в рублях
// для простоты допустим, что минимальный перевод — 1 доллар
var income = 1;
var roubles = 0;

// размер обычной и минимальной комиссии
const fee = 0.03;
const fee_min = 15000;

// курс доллара
const usd = 48.5;

// обрататываем перевод
function swift(income) {
    // переменная для расчёта комиссии
    var tax;
    // сумма в рублях
    var income_roubles;
    // переводим в рубли
    income_roubles = income * usd;
    // считаем комиссию в процентах
    tax = income_roubles * fee;
    // если она меньше минимальной
    if (tax < fee_min) {
        // то берём минимальную комиссию
        tax = fee_min;
    }
    // если комиссия больше поступившей суммы 
    if (tax > income_roubles) {
        // то берём саму сумму
        tax = income_roubles;
    }
    // результат функции — остаток в рублях
    return(income_roubles - tax);
}

// пока сумма в долларах не сравняется с рублёвым остатком
while (income.toFixed(0) != roubles.toFixed(0)) {
    // увеличиваем размер перевода на один доллар
    income += 0.1;
    // и получаем рублёвый остаток на счету
    roubles = swift(income);
    // если сайт стоит больше миллиона долларов — отказываемся от разработки
    if (income > 1000000) {break;}
}

if (income < 1000000) {
    console.log(income.toFixed(1));
} else { 
    console.log('Сумма превысила доступный бюджет');
    }
Задача про банковскую комиссию

Получается, что разработка сайта стоила 315,8 доллара. Иногда проще написать код, чем поразмышлять логически. 

Всё, идите уже на выходные, хватит. Давайте. До встречи в понедельник!

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Виталий Вебер

Любите математику? Это для вас
Попробуйте бесплатный тренажер «Основы математики для цифровых профессий». Это все необходимые знания, чтобы закрыть пробелы в математике для айтишника.
Попробовать бесплатно
Любите математику? Это для вас Любите математику? Это для вас Любите математику? Это для вас Любите математику? Это для вас
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Задача про скорость тестирования

Почему один программист уходит с работы раньше, чем второй

easy
Задача про необязательного программиста
Задача про необязательного программиста

Как потратить всё, что заработал.

easy
Головоломки для ИТ-собеседований
Головоломки для ИТ-собеседований

Четыре метода, которые помогают с решением.

easy
Задача про программистов и подбор пароля
Задача про программистов и подбор пароля

Как за три попытки определить пароль.

easy
Сколько нужно ленты для передачи данных?
Сколько нужно ленты для передачи данных?

Задача, которая ставит в тупик взрослых, хотя казалось бы

easy
Сложная задачка на логику и математику: пассажиры в вагоне

Задача про внутренний туризм

easy
Очень сложная задача про обруч
Очень сложная задача про обруч

Классическая математическая задачка, которая взрывает мозг.

easy
Задачка от Джеффа Безоса. На размышление даётся 30 секунд
Задачка от Джеффа Безоса. На размышление даётся 30 секунд

Считается, что её могут загадать на собеседовании в «Амазон».

hard
Задача на логику
Задача про хитрого электрика
hard
Парадокс средней оценки

Как такое возможно: сделать всё по отдельности лучше всех, но проиграть в общем зачёте?

hard
medium