Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
namespace tickets
{
class ticket
{
int ticket_num; // номер билета
int[] digit_mas = new int[6]; // массив циф номера билета
int i = 5;
bool repletion; // если значение превысило 999999 - то истина
int divizor = 10; // делитель (для розбивания числа на цифры)
int pre_divizor = 1; // предидущий делитель
int pre_digit; // предидущая цифра
int happy_TK_amount; // количество "счастливых" билетов
public ticket(int num_of_ticket)
{
if (num_of_ticket < 1000000 & num_of_ticket >= 100000)
ticket_num = num_of_ticket;
else
Console.WriteLine("out of range");
}
public void crash_num() // разбиваем число на цифры
{
if (i >= 0)
{
digit_mas[i] = (ticket_num % divizor - pre_digit) / pre_divizor; // от остачи от деления на порядок , вычетаем предидущю цифру , и делим на предидущий порядок - получаем цифру определённого порядка числа
pre_divizor = divizor;
pre_digit = digit_mas[i];
divizor = divizor * 10;
i--; // пишем в обратном порядке , для правильной записи последовательности цифер
crash_num();
}
}
public void echo_digits()
{
for (i = 0; i <= 5; i++)
{
Console.Write(digit_mas[i]);
}
}
public void happy_ticket() // щитает количество "счастливых" билетов
{
for (repletion = false; repletion != true; )
{
if (digit_mas[0] + digit_mas[1] + digit_mas[2] == digit_mas[3] + digit_mas[4] + digit_mas[5]) // проверяет билет на предмет "счастливости"
{
happy_TK_amount++;
}
i = 5;
num_increase();
}
Console.WriteLine("there are " + happy_TK_amount + " happy tickets");
}
public void num_increase() // увеличивает номер билета на 1
{
if (i >= 0)
{
digit_mas[i]++;
if (digit_mas[i] == 10)
{
digit_mas[i] = 0;
if (digit_mas[0] == 0)
repletion = true;
else
i--; // уменшаем индекс , для движения от младшего - к старшему разряду
num_increase();
}
}
}
}
Написать программу определения количества шестизначных 'счастливых' билетов, у которых сумма первых 3 десятичных цифр равна сумме 3 последних десятичных цифр.
подскажите плз , есть ли (естественно есть) , где и какое у меня какашкэ в коде , а то проверять меня некому , а индусом стать не хочу
ЗЫ а вообше , здесь можно так делать (просить проверить )
> подскажите плз , есть ли (естественно есть) , где и какое у меня какашкэ в коде
рука тянется к минусу, ибо
> а вообше , здесь можно так делать (просить проверить )
нужно соображать самому, в чем говно. Форумов, где можно спросить, и без нас предостаточно
зы. Просьба Страйко сделать намёк об этом в эпиграфе сайта
2 описка , изначально было много операторов , удалил операторы , а скобки забыло)
4 не совсем понял ...
ну можно например увеличивать ticket_num на 1 , а потом о5 розбивать ?
зачем лишние телодвижения ?
Я стараюсь использовать фигурные скобки даже при одной строке в цикле/условии - это, по крайней мере, создает единую стилистику. Лучше сразу писать так, чтобы не нужно было вспоминать. Собственно и конструкторы с деструкторами появились для того, чтобы не заставлять программиста помнить об необходимости инициализации/очистки. А веселиться надо обсуждая говнокод, а не создавая его 😉
>использовать фигурные скобки даже при одной строке в цикле/условии - это создает единую стилистику.
Это Ваше право, но на мой взгляд это лишь портит восприятие (и стилистику).
Похоже это чисто субъективная особенность восприятия каждого человека. Значит не мой способ, не ваш - нельзя советовать другим.
Правда, у моего способа есть незначительное оправдание: меньше писать (экономия времени).
Вообщем, это не важно. Не вижу смысла продолжать обсуждение.
.Select(i => String.Format("{0:d6}", i))
сорь , если я не прав , а это не насилие ?
разве это дело не будет "думать" в разы дольше "ужасного" num_increase() ?
У Вас стоит задача написать самый оптимальный код? Тогда с комбинаторикой будет почти без циклов.
А если задача меньше думать, написать за 5 минут и уйти с лабы в столовку с 5кой, то код NotLinoleum самое оно.
Ну епта! Это задача комбинаторная, здесь вообще нужно один алгоритм реализовать, правда для этого надо очень хорошо знать комбинаторику. 2-й курс Мех-Мат любого регионального универа, комбинаторика и теория вероятностей. Алгоритм реализуется в виде одной функции, где параметр n - целое неотрицательное чётное число, то бешь количество цифр в счастливом билете. Я на "С" реализовывал, хотя это и не принципиально.
Предлагаю такое решение. К сожалению, это на C, который знаю весьма поверхностно; С# не знаю вообще.
#include <stdio.h>
#define MAX_SUM (9 + 9 + 9)
int main (int argv, char **argc)
{
int cnt[MAX_SUM + 1]; /* счётчики 3-х значных чисел с одинаковой суммой цифр */
int i, j, k;
int tickets_cnt;
for (i = 0; i <= MAX_SUM; i++)
cnt[i] = 0;
for (i = 0; i <= 9; i++) /* первая цифра */
for (j = 0; j <= 9; j++) /* вторая цифра */
for (k = 0; k <= 9; k++) /* третья цифра */
cnt[i + j + k]++;
tickets_cnt = -1; /* -1, а не 0, чтоб исключить билет '000000' */
for (i = 0; i <= MAX_SUM; i++)
tickets_cnt += cnt[i] * cnt[i];
printf("\"Счастливых\" билетов %d шт\n", tickets_cnt);
return 0;
}
Неполная постановка задачи, ибо число цифр в двадцатисемизначном номере билета нечётное. В каких пропорциях предполагается делить номер билета на две половины, т.к. возможны варианты?
Торжественный обмен сарказмом состоялся.
Есть претензии к коду по существу? Сразу говорю, что сделано "на коленке", ибо комбинаторику не помню.
Извините, что? Безусловно, ваш пост имеет глубокий смысл, но он, увы, от меня ускользает. Если вас не затруднит, используйте для изложения ваших тезисов внятные формулировки.
var tt1 = from t1 in numbers
from t2 in numbers
from t3 in numbers
let sum = t1 + t2 + t3
group sum by new { k = t1 * 100 + t2 * 10 + t3, s = sum }
into gr
select gr;
var tt2 = from l1 in tt1
join l2 in tt1 on l1.Key.s equals l2.Key.s
select l1.Key.k * 1000 + l2.Key.k;
из мейн :
ticket TCK = new ticket(001001);
TCK.crash_num();
TCK.happy_ticket();
Console.ReadLine();
рука тянется к минусу, ибо
> а вообше , здесь можно так делать (просить проверить )
нужно соображать самому, в чем говно. Форумов, где можно спросить, и без нас предостаточно
зы. Просьба Страйко сделать намёк об этом в эпиграфе сайта
WJIRIIA:
Плюсуют, значит говно есть.
4)Функция доставила. 😀
4 не совсем понял ...
ну можно например увеличивать ticket_num на 1 , а потом о5 розбивать ?
зачем лишние телодвижения ?
> одна_строчка();
А потом станет
for(...)
первая_строчка();
вторая_строчка();
и будет весело.
>и будет весело.
Вы не любите веселиться? Оче6нь зря. 😀
Это Ваше право, но на мой взгляд это лишь портит восприятие (и стилистику).
Похоже это чисто субъективная особенность восприятия каждого человека. Значит не мой способ, не ваш - нельзя советовать другим.
Правда, у моего способа есть незначительное оправдание: меньше писать (экономия времени).
Вообщем, это не важно. Не вижу смысла продолжать обсуждение.
.Select(i => String.Format("{0:d6}", i))
.Where(i => i[0] + i[1] + i[2] == i[3] + i[4] + i[5])
.Count();
сорь , если я не прав , а это не насилие ?
разве это дело не будет "думать" в разы дольше "ужасного" num_increase() ?
А если задача меньше думать, написать за 5 минут и уйти с лабы в столовку с 5кой, то код NotLinoleum самое оно.
PS: формула в первой главе учебника
Говна там хватает, даже смотреть не буду. Начиная с использования класса (обратите внимание, локальные переменные ещё не проходили).
> очень хорошо
I LOLD
Торжественный обмен сарказмом состоялся.
Есть претензии к коду по существу? Сразу говорю, что сделано "на коленке", ибо комбинаторику не помню.
это был не сарказм, а намёк, кстати
то не вылезают из педивикии, то не загонишь, блин...
http://en.wikipedia.org/wiki/RTFM?
спойлер: а в соседней статье рассматриваются пермутации
Реализация на python:
Результаты работы:
4: 669
6: 55251
8: 4816029
10: 432457639
12: 39581170419
14: 3671331273479
16: 343900019857309
18: 32458256583753951
20: 3081918923741896839
22: 294056694657804067999
24: 28170312778225750242099
26: 2707859169387181467852099
28: 261046730157780861858821135
30: 25228791861003454642059261391
32: 2443553412892220489195278947229
34: 237126779700111728623210793896699
36: 23050391247812238203687824747157799
38: 2244066255357188250744344225634235599
40: 218768894829904122626725603838896148679
42: 2135357526350288463038827371419714518259 9
44: 2086610157206763614866736016835099941514 799
46: 2041055591672347180981968644197833025496 32799
48: 1998359874208731005735781531187223671517 1970099
50: 1958235988893910037740658552689739094876 481545139
var tt1 = from t1 in numbers
from t2 in numbers
from t3 in numbers
let sum = t1 + t2 + t3
group sum by new { k = t1 * 100 + t2 * 10 + t3, s = sum }
into gr
select gr;
var tt2 = from l1 in tt1
join l2 in tt1 on l1.Key.s equals l2.Key.s
select l1.Key.k * 1000 + l2.Key.k;