На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Счастливые билеты.
    Напишите программу для подсчета счастливых билетов, если номера билетов задаются k-значними числами, а число цифр k в номере задается как начальное даное и при решении задачи остается постоянным.
    В общем задача довольно известная для 6-тизачных билетов, код ниже, но для к-значных не имею представления как ее делать...

    ExpandedWrap disabled
      program biletu;
      var i,j,k,l,m,n:INTEGER;
          kol:longint;
      begin
      kol:=0;
      for i:=0 to 9 do
      for j:=0 to 9 do
      for k:=0 to 9 do
      for l:=0 to 9 do
      for m:=0 to 9 do
      for n:=0 to 9 do
      begin
      if i+j+k=l+m+n then kol:=kol+1;
      end;
      writeln('koli4estvo=',kol);
      readln;
      end.


    Про теги не забываем...
    Сообщение отредактировано: volvo877 -
      Потому что сделано по тупому! Нужно цикл вести по числам, а не по цифрам. Единственное что нужно сделать — это поразрядное извлечение цифр из числа и определение диапазона чисел с заданным количеством знаков.
        Вот только не надо перебирать все комбинации... Есть очень хороший "школьный" алгоритм подсчета числа счастливых билетов:

        http://www.ega-math.narod.ru/Quant/Tickets.htm

        Добавлено
        Брежнев, если задать n = 10, куда с грохотом свалится твое "очень умное" предложение? :angry:
          Цитата
          Задача 2.
          Написать программу определения количества шестизначных
          "счастливых" трамвайных билетов, у которых сумма первых трех цифр
          совпадает с суммой трех последних.

          Задача 3.
          Написать программу определения количества 2N -значных "счаст-
          ливых" билетов, у которых сумма первых N цифр равна сумме послед-
          них N цифр; N -произвольное натуральное число.

          ****************************
          Задача 2.
          Метод 1. Самое простое - это перебрать все возможные комбина-
          ции шести цифр и подсчитать число "счастливых" билетов.
          Count:=0; { количество "счастливых" билетов }
          for a1:=0 to 9 do
          for a2:=0 to 9 do
          for a3:=0 to 9 do
          for a4:=0 to 9 do
          for a5:=0 to 9 do
          for a6:=0 to 9 do
          if a1+a2+a3=a4+a5+a6 { "счастливый"? }
          then Count:=Count+1;
          Под сложностью алгоритма будем понимать количество выполнений
          тела наиболее глубоко вложенного цикла. Условие if во вложенных
          циклах будет проверяться 10^6 раз, поэтому будем говорить, что
          сложность этого алгоритма 10^6.
          Метод 2. Обратим внимание на то, что в "счастливом" билете
          последняя цифра a6 однозначно определяется первыми пятью:
          a6=(a1+a2+a3)-(a4+a5).
          Если 0<=a6<=9, то билет "счастливый", иначе - нет. Таким об-
          разом, мы можем убрать шестой вложенный цикл:
          Count:=0;
          for a1:=0 to 9 do
          for a2:=0 to 9 do
          for a3:=0 to 9 do
          for a4:=0 to 9 do
          for a5:=0 to 9 do
          begin
          a6:=(a1+a2+a3)-(a4+a5);
          if (a6>=0) and (a6<=9)
          then Count:=Count+1;
          end;
          Сложность алгоритма 10^5. Используя элементарное соображение,
          мы уменьшили сложность алгоритма и, вообще говоря, время выполнения
          программы в 10 раз!
          Метод 3. Если комбинаций a1 a2 a3 первых трех цифр с суммой
          T=a1+a2+a3 насчитывается C[T], то всего "счастливых" билетов с сум-
          мой половины T=a1+a2+a3=a4+a5+a6 будет C[T]^2. Действительно, каж-
          дое "счастливое" шестиразрядное число может быть получено склейкой
          двух произвольных трехразрядных чисел с одинаковой суммой цифр.
          Всего существует 28 всевозможных значений сумм T - от 0=0+0+0 до
          27=9+9+9. Подсчитаем C[i], i=0, ..., 28, затем найдем интересующее
          нас количество "счастливых" билетов C[0]^2 + C[1]^2 + ... + C[27]^2.
          Заметим, что "счастливых" билетов с суммой T столько же,
          сколько и с суммой 27-T. Действительно, если билет a1 a2 a3 a4 a5
          a6 с суммой T - "счастливый", то таковым же является и билет
          (999999 - a1 a2 a3 a4 a5 a6) с суммой 27-T. Поэтому число билетов
          можно вычислять и по формуле 2(C[0]^2+ ... +C[13]^2), т.е. рассмат-
          ривать только суммы T от 0 до 13.
          var C:array[0..13] of longint; { массив С из 14 элементов -
          . . . по числу возможных сумм }
          Count:=0;
          for T:=0 to 13 do C[T]:=0;
          for a1:=0 to 9 do { перебираем все }
          for a2:=0 to 9 do { возможные a1 a2 a3 }
          for a3:=0 to 9 do
          begin
          T:=a1+a2+a3;
          C[T]:=C[T]+1 { нашли еще один билет }
          end; { с суммой T }
          for T:=0 to 13 do { считаем число билетов }
          Count:=Count+C[T]*C[T];
          Count:=Count*2; { удваиваем сумму }
          Сложность этого алгоритма 10^3.
          Метод 4. В методе 3 мы перебирали комбинации цифр и искали ко-
          личество комбинаций с суммами C[T]. Сейчас мы пойдем от суммы T, и
          по ней будем определять, какое количество комбинаций a1 a2 a3 ее
          имеет. Итак T=a1+a2+a3.
          Минимальное значение, которое может принимать a1, - это
          max{0,T-18}. Член T-18 появляется из следующих соображений: пусть
          a2=a3=9, тогда a1=T-18, но a1 не может быть меньше 0. Максимальное
          значение a1=min{9,T} (так как a2 и a3 неотрицательны, то a1<=T и
          одновременно a1<=9).
          Для цифры a2 аналогично получаем, что она лежит в пределах от
          max{0,T-a1-9} до min{9,T-a1}.
          Цифра a3 по T, a1 и a2 определяется однозначно.
          Получаем, что комбинаций a1 a2 a3 с суммой T и с первой циф-
          рой a1 столько же, сколько возможных цифр a2, а именно
          min{9,T-a1}-max{0,T-a1-9}+1.
          Как и в методе 3 мы можем рассматривать диапазон сумм T от 0 до 13.
          Count:=0;
          for T:=0 to 13 do
          begin
          CT:=0;
          for a1:=max(0,T-18) to min(9,T) do
          CT:=CT+min(9,T-a1)-max(0,T-a1-9)+1;
          Count:=Count+CT*CT
          end;
          Count:=Count*2;
          Сложность этого алгоритма (т.е. количество выполнений
          операций присваивания внутри двух вложенных циклов) есть 95.

          Задача 3.
          Задача опять же имеет очевидное решение, которое состоит в ге-
          нерации всех 2N-разрядных чисел и проверке их на требуемое
          свойство. Однако общее количество таких чисел равно 10^(2N) и поэ-
          тому при N>3 практически очень трудно получить результат на ЭВМ.
          Следовательно необходимо разработать алгоритм, не требующий генера-
          ции чисел.
          Определим через S(k,i) количество k-разрядных чисел, сумма
          цифр которых равна i. Например, S(2,3)=4, так как существует 4
          двуразрядных числа (03,12,21,30), сумма цифр которых равна 3. Лег-
          ко заметить, что S(1,i)=1 при i<10 и S(1,i)=0 при i>9. Предположим
          теперь, что мы сумели вычислить значения величин S(N,i) для всех i
          от 0 до 9N, т.е. мы знаем, сколько существует N-разрядных чисел с
          суммой цифр, равной 0,1,...,9N ( 9N - максимальная сумма цифр в
          N-разрядном числе). Тогда нетрудно убедиться, что общее количество
          "счастливых" 2N-разрядных чисел равно
          P=S(N,0)^2+S(N,1)^2+...+S(N,9N)^2.
          Действительно, рассуждая как и в методе 3, каждое "счастливое"
          2N-разрядное число может быть получено склейкой двух произвольных
          N-разрядных чисел с одинаковой суммой цифр.
          Таким образом, необходимо уметь вычислять значения величин
          S(k,i) для всех k<=N,i<=9k. Определим способ вычисления S(k+1,i)
          через значения величин S(k,j), j<=i. Понятно, что любое k+1-разряд-
          ное число может быть получено из k-разрядного добавлением еще одно-
          го разряда (цифры). Следовательно
          S(k+1,i) = S(k,i-ц1)+S(k,i-ц2)+...,
          где ц1,ц2,... - возможные добавленные цифры. Ясно, что это 0,1,...,m
          где m=min(9,i). Следовательно,
          S(k+1,i) = S(k,i-0)+S(k,i-1)+...+ S(k,i-m).

          Задача 3.2.
          Используем метод решения задачи 3.
          Решение 3.2b. Обозначим это количество Сm(k,n). Последняя циф-
          ра числа в m-ичной системе счисления может принимать одно из значе-
          ний 0, 1, ..., m-1. В соответствии с этим сумма цифр (n-1)-значного
          числа, получающаяся из n-значного числа отбрасыванием последней
          цифры, может принимать одно из значений k, k-1, ..., k-m+1. Отсюда
          получаем, что
          Cm(k,n)=Cm(k,n-1)+...+Cm(k-m+1,n-1).
          Кроме того Cm(k,1)=1 при 0<=k<=m-1, и Cm(k,1)=0 иначе (в m-ич-
          ной системе счисления существует только одно однозначное число с
          суммой цифр k, 0<=k<=m-1, и ни одного такого числа, если k>=m.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0228 ]   [ 15 queries used ]   [ Generated: 8.05.24, 11:48 GMT ]