@Leatington

Как найти «счастливые» билетики (числа) с помощью JavaScript?

Задали в универе задачку:

Подсчитать, сколько n-значных чисел имеют равную сумму первой половины
и второй половины цифр ("счастливые" числа). Число n является четным.
Например, для n = 6 числа "001010", "112220", "000000" счастливые.

Вот пример как должно быть:
615b52c3c6ab3745356179.png

Я написал следующий код, но, всё равно что-то не то...

function getLuckyTicketsCount(n){
    let count = 0;
  
    for (let i = 1; i<Math.pow(10,n);i++)
  {
    let s = String(i);
        let l = s.length;

    if ((l % 2) !== 0)
    {
      l++;
      s = s + '0';
    }
    
        let str1 = s.substr(0, l/2).split('');
        let str2 = s.substr(l/2, l).split('');
        let [sum1, sum2] = [0, 0];
    
        for (let k = 0; k<str1.length; k++)
    {
            sum1 = sum1+Number(str1[k]);
        }
        for (let k = 0; k<str2.length; k++)
    {
            sum2 = sum2+Number(str2[k]);
        }
        if (sum1 == sum2)
        {
            count++;
        }
    
    }
  
    return count
}
  • Вопрос задан
  • 657 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Можно для «половины» числа пробежаться и составить словарь { сумма: счётчик }, сколько раз каждая сумма встретилась на всём диапазоне 000..999 (для n = 6, т.е. половина = 3)
Сумма квадратов счётчиков даст общее число счастливых билетов.
Почему квадратов
Например, сумму 1 даёт 3 варианта (001, 010, 100). И для каждого из них в правой части билета может быть каждая из 3 комбинаций. Итого 3 * 3 = 9 вариантов билета с суммами 1 = 1.
function getLuckyTicketsCount(n) {
  const sums = {};
  for (let i = 0; i < Math.pow(10, n >> 1); i++) {
    // посчитать сумму цифр
    let sum = 0, d = i;
    while (d > 0) {
      sum += d % 10; // прибавили младшую цифру
      d = Math.floor(d / 10); // сдвинули число вправо на 1 цифру
    }

    // и в словарь прибавить 1 для этой суммы
    sums[sum] = (sums[sum] || 0) + 1;
  }

  return Object.values(sums) // счетчики суммм
    .map((n) => n * n) // квадраты
    .reduce((acc, c) => acc + c); // сложить все
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы