Задачки с счастливым билетиком

1 n 2 n 3 n 4 n 5 n 6 n 7 n 8 n 9 n 10 n 11 n 12 n

1 n
Имеется лента билетов с восьмизначными номерами. Первый билет имеет номер M, последний - N.
M и N отвечают следующему соотношению: 10000000Ј M<NЈ 99999999.
Необходимо определить количество "счастливых" билетов в ленте.
Билет считается "счастливым", если сумма первых четырех цифр равна сумме последних четырех цифр.
Исходные данные:
Во входном файле построчно находятся M и N.
Пример файла исходных данных:
11111110
11111112
Выходные данные:
В выходном файле необходимо поместить искомое количество "счастливых" билетов в ленте.
Выходной файл для приведенного примера: 1

наверх
2 n
Необходимо посчитать количество "счастливых" билетов с заданной суммой цифр, среди тех, номер которых состоит из 2*N разрядов. "Счастливым" является билет, у которого сумма первых N цифр равна сумме N последних цифр. Исходные данныеВо входном файле находятся два числа разделенных пробелом: первое - N (1<=N<=50); второе - сумма цифр интересующих нас билетов (неотрицательное число не превосходящее 1000). РезультатВ качестве ответа необходимо вывести найденное число "счастливых" билетов. Пример исходных данных
2 2
Пример результата
4
ПодсказкаВ примере условию удовлетворяют билеты: 0101, 0110, 1001, 1010

наверх
3 n
Задан номер шестизначного "счастливого билета". "Счастливым" считается билет, сумма трех первых цифр которого равна сумме трех последних цифр. Написать программу, печатающую номер следующего счастливого билета. В программе должны использоваться только операторы ввода/вывода, операторы присваивания, арифметические операции и условные операторы.

наверх
4 n
Будем считать, что автобусный билет имеет шестизначный номер, а счастливый билет это тот, у которого сумма первых трех цифр равна сумме трех остальных. Сколько всего счастливых билетов?

наверх
5 n
Найти число К - счастливых билетов для N<=11 значных чисел.
Например, дляЪ N=1 имеем К=10. Пример счастливого билета 121, 0220

наверх
6 n
Номера троллейбусных билетов представляют собой шестизначные числа. Счастливым считается тот билет, у которого сумма первых трёх цифр равна сумме трёх последних. Например, билет 902 560 считается счастливым. Найдите количество счастливых билетов, если номера билетов находятся в диапазоне [000 000 ... 999 999].

наверх
7 n
Автобусный билет считается счастливым, если между его цифрами можно в нужных местах расставить знаки четырех арифметических действий и скобки так, чтобы значение полученного выражения равнялось 100. Является ли счастливым билетом билет ѕ 123456 ?

наверх
8 n
Автобусный билет имеет шестизначный номер (от 000001 до 999999). Билет называется счастливым, если сумма первых трех цифр номера равна сумме трех его последних цифр. Докажите, что количество счастливых билетов не больше 1/11 от общего числа билетов.
9 n
Автобусные билеты имеют номера от 000000 до 999999. Билет называется счастливым, если сумма первых трех цифр его номера равна сумме последних трех его цифр. Докажите, что:
а) число всех счастливых билетов четно;
б) сумма номеров всех счастливых билетов делится на 999.

Решение:
Как можно пытаться доказать, что количество счастливых билетов четно? Можно стараться подсчитать это количество. В принципе, эта задача вполне разрешима, однако она гораздо сложнее предложенной. Другой естественный способ -- постараться разбить все счастливые билеты на пары. Мы укажем два способа такого разбиения.
Первый способ. Переставим в номере билета первые три цифры с последними тремя цифрами. Полученный билет и поставим в пару исходному (например, билету 239671 парой будет 671239). Очевидно, что этот билет также будет счастливым и парой к нему является исходный билет. Так мы разбили на пары все билеты кроме тех, которые являются парными сами к себе. Это билеты, для которых первые три цифры номера совпадают с последними тремя цифрами (все такие билеты счастливые). Сколько таких билетов? Их ровно 1000. Действительно, первые три цифры их номера могут образовывать любое трехзначное число от 000 до 999 (всего 1000 возможностей), при этом оставшиеся три цифры однозначно определяются первыми тремя (а именно, должны их в точности повторять). Итак, мы имеем какое-то количество счастливых билетов, разбитых на пары (оно очевидно четное), и еще 1000 билетов, пары не получивших. Значит, общее число счастливых билетов четно. Пункт a) доказан.
Второй способ. Этот способ поможет нам также доказать пункт б). Каждому счастливому билету поставим в соответствие билет, номер которого состоит из цифр, дополняющих соответствующие цифры номера исходного билета до девятки. Например, билет 239601 получит в пару билет 760398. Из равенства сумм троек цифр следует равенство сумм их дополнений до девятки, поэтому парой к каждому счастливому билету является также счастливый билет. Очевидно, что если билет получает в пару билет , то и наоборот, билет получает в пару билет . При этом никакой билет не получает в пару себя, так как в этом случае каждая цифра его номера должна была бы дополнять до девятки самое себя, что невозможно, поскольку 9 -- нечетное число. Таким образом, мы получили разбиение всех счастливых билетов на пары. При этом сумма номеров билетов любой пары равна 999999, значит, она делится на 999. Сложив эти попарные суммы, получим число, делящееся на 999. С другой стороны, это будет сумма номеров всех счастливых билетов.
наверх
10 n
tickets ds = (ds, foldl (\n c -> 10*n + digitToInt c) 0 ds) :
[("("++ld++[op]++rd++")", f lv rv) |
(op,f) <- [('+',(+)),('-',(-)),('*',(*)),('/',(div))], n<-[1..length ds-1],
(ld,lv) <- tickets (take n ds), (rd,rv) <- tickets (drop n ds),
op /= '/' || (rv /= 0 && lv `mod` rv == 0)]

happy = map fst . (filter ((==)100 . snd)) . tickets

Hugs session for:
/usr/share/hugs/lib/Prelude.hs
ticket.hs
Type :? for help
Main> happy "314159"
["(3+(1+(4*(15+9))))","(31+((4*15)+9))","((3+1)+(4*(15+9)))",
"(((3*14)-1)+59)","((31+(4*15))+9)","((3*14)-(1-59))",
"((31*4)-(15+9))","(((31*4)-15)-9)","((3-1)*(4+(1+(5*9))))",
"((3-1)*((4+1)+(5*9)))"]
Main> [Leaving Hugs]

наверх

11 n
"Счастливым " называется билет, в котором в шестизначном номере сумма первых трех цифр равна сумме последних трех.
Шаг 1: Исходные данные и результат. Функция возвращает целое -количество " счастливых " билетов. Формальных параметров нет.
Шаг 2: Если известно, каким образом преобразовать шестизначное число в массив из 6 значений его цифр, то алгоритм будет состоять в последовательном разложении всех шестизначных чисел на цифры и проверки результата на " счастье " .

int calc()

{

int n; // Количество "счастливых" билетов

long v; // Проверяемое шестизначное число

int B[6]; // Массив значений цифр

for (n=0,v=0; v < 1000000; v++)

{

// Разложить val в массив значений цифр числа - B

if (B[0]+B[1]+B[2]==B[3]+B[4]+B[5]) n++;

}

return n;

}
Шаг 3: Остаток от деления целого числа на 10 дает значение младшей цифры, например 1996 % 10 = 6. Частное от деления целого числа на 10 дает то же самое число без последней цифры: 1996 / 10 = 199. Тогда остатки от последовательного деления на 10 исходного числа дадут искомые значения цифр (при условии, что частное от деления на следующем шаге становится делимым).


int m; // Номер шага (цифры)

long vv; // Исходное число

for (vv = v, m=0; m< 6; m++)

{

B[m] = vv % 10; // Остаток - очередная цифра

vv = vv / 10; // Частное становится делимым

}
Окончательный вариант:

//------------------------------------------------------bk32-03.cpp

//------Счастливые билеты

int calc()

{

int n, B[6];

long v;

for (n=0,v=0; v < 1000000; v++)

{

int m;

long vv;

for (vv = v, m=0; m< 6; m++, vv /=10)

B[m] = vv % 10;

if (B[0]+B[1]+B[2]==B[3]+B[4]+B[5]) n++;

}

return n;

}
На первый взгляд такое количество шагов в последовательной детализации программы может показаться излишним. На самом деле программист должен делать их не на бумаге и не на экране монитора, а у себя в голове, превращая словесную формулировку некоторой части алгоритма в формальную запись на языке программирования, в которой тем не менее остаются неформализованные куски.

наверх

12 n
#include <iostream>
#include <fstream>

using namespace std;

int V[2][10000];

int main(void)
{
fstream fin,fout;
long N, S;
int i, j, k, sel;

fin.open("input.txt", ios::in);
fout.open("output.txt", ios::out);
if(!fin || !fout)
return 1;
fin>>N>>S;
fin.close();

S /= 2; sel = 0;
memset(V, 0, sizeof(V));
V[sel][10] = 1;
for(i = 0; i < N; i++)
{
memset(V[sel ^ 1], 0, sizeof(V) / 2);
for(j = 10; j <= S + 10; j++)
V[sel ^ 1][j] = V[sel ^ 1][j - 1] + V[sel][j] - V[sel][j - 10];
sel = sel ^ 1;
}

fout<<V[sel][S + 10] * V[sel][S + 10]<<endl;
fout.close();

return 0;
}

наверх

 

Сайт создан в системе uCoz