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

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

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

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

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

«Банк конвертирует доллары в рубли по текущему курсу банка — 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 доллара. Иногда проще написать код, чем поразмышлять логически. 

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

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