![]() |
![]() |
![]() |
|
Можно ли в 1С проверить, четное чиСло или нет без Цел и циклов? Ø (длинная ветка 24.07.2008 12:16) |
☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
23.07.08
✎
16:45
|
Продолжим, т.к. предыдущая была слишком длинной:
Можно ли в 1С проверить, четное чиСло или нет без Цел и циклов? Итак, нужно дать решение или доказать, что не существует решения для следующей задачи. Для любого натурального числа нужно проверить, является ли оно четным, с помощью арифметических операций + - / *. При этом нельзя использовать циклы (явные или не явные), число итераци |
|||
1
Rovan
гуру
23.07.08
✎
16:51
|
(0) операции "<", ">" можно ?
|
|||
2
Nefeste
23.07.08
✎
16:52
|
не знаю есть ли в 1С 16-ичные числа и разрешены ли побитовые логические операции условиями задачи, но если бы я писал на сях, то получилось бы что-то вроде такого:
inline bool isEven(long x) { return ((x & 0x01) == 0); } ну или аналогично: inline bool isOdd(long x) { return (x & 0x01); } |
|||
3
Rovan
гуру
23.07.08
✎
16:54
|
(0) а рекурсию можно ?
|
|||
4
Гений 1С
гуру
23.07.08
✎
17:03
|
(1) Можно, конечно же ветвление. ;-)
(3) Рекурсия - это скрытый цикл... Если число циклов не будет пропорционально величине числа, то можно... |
|||
5
Nefeste
23.07.08
✎
17:18
|
(0) вообще поясните что такое "с помощью арифметических операций + - / *",
а конкретно - что значит операция "/"? выполняет деление с остатком?.. или деление нацело? Если речь идет о программировании, то есть такое понятие, как преобразование типов. С потерей дробной части. Тогда решается задача просто: пусть у нас нет оператора {%, mod, остаток от деления, как вам угодно} - ну дак мы его можем легко получить.. mod(x / y) = x - long(x / y) * y; и тогда уже пресловутый x % 2, преобразуясь в x - long(x / 2) * 2; нам все подскажет про четность числа.. хотя этот вариант уже тоже писали и он чем-то не устроил |
|||
6
Fragster
гуру
23.07.08
✎
17:20
|
(0) достал топик, да! без циклов, если уж на то пошло, и операции * и / не делаются на низком уровне, так что в газенваген!
|
|||
7
Fragster
гуру
23.07.08
✎
17:20
|
(6)+ к тому же % выполняется быстрее, чем / ....
|
|||
8
vde69
23.07.08
✎
17:21
|
(0) а чем не устроил пункт 201 из пред. ветки? хотя там есть преобразование в текст, но там нету операций над этим текстом...
|
|||
9
Гений 1С
гуру
23.07.08
✎
17:23
|
(8) В текст преобразовывать нельзя!
|
|||
10
Nefeste
23.07.08
✎
17:36
|
(0) вобщем если нам даны только операции /, - и * (плюс нам не нужен) и мы умеем отличать целое (натуральное) число от дробного )), то задача легко решается как это описано, например, в (5). а если мы не умеем "отбрасывать дробную часть" после деления и после деления натурального числа можем получить вещественное и пытаться анализировать его с помощью одних лишь арифметических операций, то такая задача без циклов решения не имеет...
|
|||
11
Fynjy
23.07.08
✎
17:41
|
log10(x*5+5)-log10(x*5-5) :)
|
|||
12
Злопчинский
23.07.08
✎
17:41
|
очпросто - надо вытянуть из "оперативы" адрес этого целого числа и взять правый бит...
|
|||
13
smaharbA
23.07.08
✎
17:41
|
(10) ты не в теме...
|
|||
14
Гений 1С
гуру
23.07.08
✎
17:43
|
(11) Функции нельзя.
(10) Блин, ну как-то привести число к нулю и посмотреть, что там в минусе остается -0.5 или -1... Что то в этом духе, блин... Истина где-то ж рядом... |
|||
15
Fragster
гуру
23.07.08
✎
17:44
|
||||
16
Nefeste
23.07.08
✎
17:46
|
(13) ну дак введи в курс дела: что не так написал? как надо, чтобы быть в теме?
|
|||
17
Гений 1С
гуру
23.07.08
✎
17:47
|
(16) Ты должен доказать, что задача не имеет решения. Жду доказательства.
|
|||
18
Гений 1С
гуру
23.07.08
✎
17:47
|
Ляпнуть, что нет решения любой может, а вот доказать это сложнее
|
|||
19
IT Михаил
23.07.08
✎
17:49
|
условие если оканчивается на 1 3 5 7 9 то , иначе ...
|
|||
20
Живой Ископаемый
23.07.08
✎
17:51
|
(19) А как определить на какую цифру оканчивается число? с помощью указанных арифм. действий...
|
|||
21
Fragster
гуру
23.07.08
✎
17:52
|
(17),(18) если использовать wscript - из 1с его вызвать можно - сдвинуть вправо на 1 бит, сдвинуть влево, сравнить. на сим предлагаю ветку закрыть.
|
|||
22
IT Михаил
23.07.08
✎
17:53
|
(20) в строку и по последнему справа символу )
|
|||
23
Живой Ископаемый
23.07.08
✎
17:54
|
(22) В строку нельзя, отпадает... :(
|
|||
24
Fynjy
23.07.08
✎
17:54
|
Вот ведь вопрос как определить последнюю цифру ...
1*5 = 5 2*5 = 10 3*5 = 15 и т. д. Или цифру после запятой ... 0,5 1 1,5 И т. д. Но мне кажется это не правильный путь ... |
|||
25
IT Михаил
23.07.08
✎
17:54
|
к (19) и (22) ну!? как это было!??
давайте звание гения сделаем переходящим по голосованию |
|||
26
Fragster
гуру
23.07.08
✎
17:54
|
Таб = СоздатьОбъект("ТаблицаЗначений");
Таб.НоваяКолонка("Достало","Число",10,0); Таб.ДобавитьСтроку(); Таб.Достало = ПроверяемоеЧисло/2-0.1; Если Таб.Достало*2 = ПроверяемоеЧисло Тогда // Четное Иначе // Нечетное КонецЕсли; и ниипетъ |
|||
27
IT Михаил
23.07.08
✎
17:55
|
(23)я не пойму почему отпадает, что асфальт этим местом легче ковырять чем отбойным молотком?
|
|||
28
smaharbA
23.07.08
✎
17:55
|
(11) условие - только арифметика
|
|||
29
Живой Ископаемый
23.07.08
✎
17:56
|
Я как-то задался вопросом - будет ли простое число простым в другой системе исчисления... Даже зачем-то начал проверять... Потом мне сказали, что простыми же бывают только натуральные числа... а какая разница в какой системе исчисления 31 корову или 17 яблок?
|
|||
30
Fragster
гуру
23.07.08
✎
17:56
|
(28) не, условие - "в 1с"
|
|||
31
ShoGUN
23.07.08
✎
17:56
|
Хрень какая... Теорема Ферма для 1С-ников :)
|
|||
32
Fynjy
23.07.08
✎
17:57
|
Или как определить целое число или нет, не используя функций - тож не правильный путь ...
Вот правильный :) Но вот как составить формулу ... * Сложение и вычитание: o чётное ± чётное = чётное o чётное ± нечётное = нечётное o нечётное ± чётное = нечётное o нечётное ± нечётное = чётное * Умножение: o чётное ? чётное = чётное o чётное ? нечётное = чётное o нечётное ? чётное = чётное o нечётное ? нечётное = нечётное * Деление: o чётное / чётное — может быть любым o чётное / нечётное = чётное, если целое o нечётное / чётное — не может быть целым o нечётное / нечётное = нечётное, если целое |
|||
33
IT Михаил
23.07.08
✎
17:57
|
Гений, мой вариант принят или нет? он соответствует условию.
|
|||
34
Живой Ископаемый
23.07.08
✎
17:57
|
+(29) записать
|
|||
35
IT Михаил
23.07.08
✎
17:58
|
без Цел и циклов в 1С я все сделал правильно, словоблудие заканчиватся, я победил
|
|||
36
Fragster
гуру
23.07.08
✎
17:58
|
(32) эти данные - основа для рекурсии и 2-х базовых чисел - 1 и 0 как четного и нечетного. Гений сей подход отсеял как непродуктивный
|
|||
37
Fragster
гуру
23.07.08
✎
17:59
|
(35) где???
|
|||
38
Fragster
гуру
23.07.08
✎
18:00
|
(36)+ вообще в математике половина определений - рекурсивные ;) 2н+1 Р = М/н и тд...
|
|||
39
bahmet
23.07.08
✎
18:13
|
Шёл второй день,
нобелёвку так никто и не получил. А ведь путь к решение очевиден.... |
|||
40
bahmet
23.07.08
✎
18:15
|
+(39)Ипанутую задачу с ипанутыми условиями может решить тока полный ипанашка с ипанутой логикой...
|
|||
41
Fragster
гуру
23.07.08
✎
18:17
|
павтаряйув 1с без циклов и рекурсий:
Таб = СоздатьОбъект("ТаблицаЗначений"); Таб.НоваяКолонка("Достало","Число",10,0); Таб.ДобавитьСтроку(); Таб.Достало = ПроверяемоеЧисло/2-0.1; Если Таб.Достало*2 = ПроверяемоеЧисло Тогда // Четное Иначе // Нечетное КонецЕсли; или - с элементами биосопроцессора: Если Вопрос("Число "+Строка(ПроверяемоеЧисло)+" четное?","ДаНет") ="Да" Тогда // четное Иначе // Нечетное КонецЕсли |
|||
42
dimaldinho
23.07.08
✎
18:28
|
Смущает "в 1С" в заголовке темы. В "1С" можно создать реквизит типа число с точностью 0 и
Исходное = Число; Число = Число / 2; Если Исходное = 2 * Число Тогда Сообщить("Четное"); Иначе Сообщить("Нечетное"); КонецЕсли; Только это неявное ЦЕЛ. |
|||
43
Fragster
гуру
23.07.08
✎
18:29
|
(42) смотри внимательнее (41)... и ищи у себя ошибку ;)
|
|||
44
Ненавижу 1С
гуру
23.07.08
✎
18:49
|
Некоторая формализация задачи:
Работаем только с истинно вещественными числами. То есть будем считать, что выражение вычисляется математически точно (машинно естественно не реализуемо). Без циклов означает, что независимо от входного значения будет использовано не более определенного числа итераций (возможно очень большого), ограниченного для всех входящих параметров одновременно. 1. Задача эквивалентна определению, что число целое. Достаточно поделить на 2. И наоборот, если целое, то удвоенное четное. 2. С помощью 4 арифметических операций можно получить дробно-линейные функции. Проверка на условия ><= может выявить знак этой функции (если сравниваем не с 0, то достаточно сделать вычитание этой функции и сравнивать таки с нулем). Эти функции меняют знак конечное число раз! Если условия вложенные, то есть «если то что посчитали>0 тогда посчитать вот это» означает, что на определенном участке знакопостоянства нужно применить другую функцию. 3. В силу конечности итераций разбиений на знакопостоянные куски будет конечное число. Но нам нужно получить множество целых чисел и только его. А оно дискретно и бесконечно: состоит из бесконечного ряда изолированных точек. Противоречие. |
|||
45
Гений 1С
гуру
23.07.08
✎
19:33
|
(21) сдвигать нельзя, хватит тупить. Условие задачи уже сформировано, нужно или доказать что нет решения, или решить.
|
|||
46
Гений 1С
гуру
23.07.08
✎
19:37
|
(33) В строку нельзя, весь прикол в чистой арифметике.
(31) Да, действительно, простая задача а решить никто не может... ;-) (41) Харе прикалываться. Ты используешь неявное округление, а округление юзать нельзя. Неужели сложно соблюдать условие задачи, или 1сники не привыкли работать по ТЗ? (44) Не вкурил, можно на примерах. Пока я видел пример с делением на 10 и сравнением с единицей, но он зависит от разрядности числа. Лучше ничего никто не предложил. |
|||
47
Ненавижу 1С
гуру
23.07.08
✎
19:41
|
(46) на каких примерах можно иллюстрировать доказательство несуществования?
|
|||
48
Гений 1С
гуру
23.07.08
✎
19:44
|
Короче, я тут за ужином подумал, чуваки.
Я действительно гений. Учитесь. Решение сделано в расчете на то, что разрядность хранения чисел в компьютере ограничена, но какая именно разрядность, нас не интересует. Пусть есть некоторое число Х, нужно проверить его четность. Берем в качестве I числа Х, Х+1, Х+2 и для каждого из них проверяем выполнение равенства: I/3 = I/3*3 Если равенство соблюдается, то число I делится на 3 нацело. А тут уже легко подумать о четности X, зная Х и I. Можно проверить, делится ли на 3 число X/2. |
|||
49
IT Михаил
23.07.08
✎
19:47
|
(46)а в теме этого не написано, как в песочнице, блин
|
|||
50
IT Михаил
23.07.08
✎
19:48
|
(48)отрыл наверно где-то в юном технике 80-го года
|
|||
51
Ненавижу 1С
гуру
23.07.08
✎
19:51
|
(48) ты с математикой вообще дружишь?
|
|||
52
КонецЦикла
23.07.08
✎
20:05
|
Можно его забанить?
|
|||
53
Гений 1С
гуру
23.07.08
✎
20:10
|
(51) я имел ввиду I = I / 3 * 3
например, 5 <> 5/3*3 т.к. при делении на 3 всегда получается или 3 или 6 в периоде, а т.к. разрядность ограниченная то при умножении на 3 получим другое число. Вот, для числа 3 мы можем проверить, делится или нет на 3 нацело. Где-то рядом и алгоритм на 2. |
|||
54
ShoGUN
23.07.08
✎
20:36
|
(53) Жжош! :))) С каких пор деление на 2 дает периодическую дробь? :)
|
|||
55
Гений 1С
гуру
23.07.08
✎
20:53
|
(54) На 3 деление, на 3... Я пока придумал только как проверить делимость на 3.
Числа, которые делятся на 3 идут последовательно - четное нечетное: 3 6 9 12 15.... Т.е. я знаю, как проверить, что число делится на 3 или найти ближайшее число, делящееся на 3. ;-) |
|||
56
ShoGUN
23.07.08
✎
21:02
|
(55) Для двойки это никак не подходит. Твой способ - это _косвенное_ определение - является ли число переодической дробью.
Вопрос - можно ли только с помощью арифметики и условий отличить целое число от дробного в 1С? В этом задачка и заключается. |
|||
57
ShoGUN
23.07.08
✎
21:07
|
+(56) А вообще тупняк получается - отобрали один из основных инструментов(цикл) и требуем, чтоб работало и без него... Имхо есть куча задач, которые без цикла решить не получается, не только четность.
|
|||
58
Медвед1Сник
23.07.08
✎
21:13
|
(48) Это не универсальное решение опирающееся чисто на арифметические операции а такое же (по типу) как и у меня где предполагается ограниченная разрядность представимых чисел. Какой же ты гений!? :)))))
|
|||
59
Wasya
23.07.08
✎
21:15
|
(48) >>проверяем выполнение равенства: I/3 = I/3*3
Ничего не понял I/3 = I/3*3 выполняется если I=0 |
|||
60
Гений 1С
гуру
23.07.08
✎
21:16
|
(58) быстрее, чем твой метод, потому и без цикла
|
|||
61
Гений 1С
гуру
23.07.08
✎
21:18
|
(57) Про трудоемкость алгоритма слыхал? N, n2 log2N? Вот и я хочу чтобы она была небольшой
|
|||
62
Гений 1С
гуру
23.07.08
✎
21:20
|
(59) кури (53) тормозим?
|
|||
63
Медвед1Сник
23.07.08
✎
21:24
|
(60) Да, быстрее но уже не "чиста арифметические операции" а это существенное нарушение условий задачи. Мой метод оставался строго в рамках арифметических операций. И для общего (но только общего!) решения требовал бы цикл. Короче ничего лучше своего метода я тут пока не видел. :))))
|
|||
64
ЗлобнийМальчик
23.07.08
✎
21:25
|
неплохая такая трудоемкость - для периодической дроби для дробной части одноэсия выделит все те 1024 бита и потом будет это дело умножать/делить сравнивать
|
|||
65
Wasya
23.07.08
✎
21:27
|
(62) Если использовать особенности компьютера или интерпретатора, то и такой код канает:
Перем Масс[100000000]; Попытка Масс[ВыбЧисло/2]=0; Сообщить("Четное"); Исключение Сообщить("Нечетное"); КонецПопытки |
|||
66
Fynjy
23.07.08
✎
21:34
|
(62) Странный ты ... Говоришь арифметически ... А сам пользуешься особенностью количества после запятой ...
Так знай гЕний ... Арифметически A = A/3*3 всегда ... Потому что существует возможность формулу выразить в следующем виде ... A/3 = A/3 или A*3 = A*3 |
|||
67
Медвед1Сник
23.07.08
✎
21:36
|
Вот что меня удивило... А нахрена одинэске такие огромные числа? Я имею. в виду 1024битную разрядность. Нахрена спрашивается это в сугубо экономической проге?
|
|||
68
Wasya
23.07.08
✎
21:39
|
(44) Прелагаю свои наметки доказательства невозможности.
Решаем задачу: дано число Х опрделеить целое оно или нет. Чтоб доказать что число Х нецелое надо показать, что Х>N и Х<N+1, где N целое число. Эта задача очень похожа на задачу поиска по ключу в отсортированном массиве. Известно, что задача поиска не может быть решена за время быстрее O(logN) |
|||
69
Kiber
23.07.08
✎
21:41
|
(0) Задача поставлена некорректно.
Надо перечислить ВСЕ возможные методы, которыми можно пользоваться. Например: +, -, *, /, ЕСЛИ, <, > При помощи указанных арифметических операций задачу решить невозможно. Нужен либо Цел, либо операция, аналогичная Цел (такие как: Таблицей Значений с ограничениями по количеству знаков после запятой, переводом в строку + Прав, взять байт из памяти). |
|||
70
Гений 1С
гуру
23.07.08
✎
21:44
|
(64) мы считаем число простых операций + - * /, а не циклов на языке 1с
|
|||
71
Медвед1Сник
23.07.08
✎
21:44
|
(69) Или хотя бы тригонометрические функции чтобы преодолеть линейность арифметических операций. Можно что-то с косинусом и синусом замутить.
|
|||
72
Гений 1С
гуру
23.07.08
✎
21:45
|
(69) Но ведь делимость на 3 я могу проверить с помощью всего двух операций - деления на 3 и умножения на 3... гыгыгыгы, а вы говорите невозможно...
|
|||
73
Гений 1С
гуру
23.07.08
✎
21:45
|
(71) давай без извращений
|
|||
74
Гений 1С
гуру
23.07.08
✎
21:47
|
Вот вам еще мысля.
1 2 3 4 5 6 - все при делении на 7 дают периодические дроби. То бишь мы проверяем делимость на 3 и на 7, находим насколько число удалено от ближайшего числа, делящегося на 7 и на 3, исходя из этой инфы получаем четное или нет. Это уже можно проверить на компе. Т.е. проанализировать первые 1000 чисел, для каждого из них вычислить расстояние до ближайшего делящегося на 3 и на 7 числа и посмотреть, какие из них четные, какие нет. |
|||
75
Медвед1Сник
23.07.08
✎
21:48
|
(73) Ну I <> I / 3 * 3 скорее извращения. :) А синус-косинус могутпомочь правда это уже иррациональные числа, пи опять таки. И операции не определяемые алгоритмически т.е. нет такого алгоритма который за конечно число шагов вычислить синус какого-то числа. :))))))
|
|||
76
AAZ
23.07.08
✎
21:51
|
Подсчитал я тут количество прохождений по циклам в своем варианте. Получил следующую картину:
22 для 11 36 для 100 58 для 111 73 для 1011 87 для 1100 109 для 1111 125 для 10111 140 для 11011 154 для 11100 176 для 11111 193 для 101111 209 для 110111 224 для 111011 238 для 111100 260 для 111111 278 для 1011111 295 для 1101111 311 для 1110111 326 для 1111011 340 для 1111100 362 для 1111111 Это к вопросу об эффективности алгоритма :) Можно, конечно, подчитать именно число арифметических операций... Но порядок от этого не сильно изменится - чем больше число, тем эффективней |
|||
77
Kiber
23.07.08
✎
21:54
|
(72) Точно так-же можно проверить делимость на любое простое число, кроме 2 :-))
|
|||
78
Гений 1С
гуру
23.07.08
✎
21:55
|
(77) На 5 не получится
|
|||
79
Kiber
23.07.08
✎
21:56
|
+(77) 1 2 и 5 =))) Извиняюсь)
|
|||
80
Гений 1С
гуру
23.07.08
✎
21:57
|
Написал код:
Функция ПоискДелителя(Знач Ч, Делитель) Пока Истина Цикл Если Ч % Делитель = 0 Тогда Возврат Ч; КонецЕсли; Ч=Ч+1; КонецЦикла; КонецФункции Функция ___обВывестиТаблицуЗначений(П) Экспорт #Если Клиент Тогда Перем ТЗ, Макет, Т, ПараметрыШапки, ПараметрыПодвала, ИмяШапки, ИмяСтроки, ИмяПодвала, Показывать, РасчитыватьИтоги, НачальнаяСтрока, ЗаголовокОкна; П.Свойство("ЗаголовокОкна", ЗаголовокОкна); П.Свойство("ТЗ", ТЗ); П.Свойство("Макет", Макет); П.Свойство("Т", Т); П.Свойство("ПараметрыШапки", ПараметрыШапки); П.Свойство("ПараметрыПодвала", ПараметрыПодвала); Если НЕ П.Свойство("ИмяШапки", ИмяШапки) Тогда ИмяШапки="Шапка"; КонецЕсли; Если НЕ П.Свойство("ИмяСтроки", ИмяСтроки) Тогда ИмяСтроки="Строка"; КонецЕсли; Если НЕ П.Свойство("ИмяПодвала", ИмяПодвала) Тогда ИмяПодвала="Подвал"; КонецЕсли; Если НЕ П.Свойство("Показывать", Показывать) Тогда Показывать=Истина; КонецЕсли; Если НЕ П.Свойство("РасчитыватьИтоги", РасчитыватьИтоги) Тогда РасчитыватьИтоги=Истина; КонецЕсли; //Если таблица не задана, создаем ее Если Т=Неопределено Тогда Т=Новый ТабличныйДокумент(); НачальнаяСтрока=1; Иначе НачальнаяСтрока=Т.ВысотаТаблицы+1; КонецЕсли; //Выводим шапку через макет Если ИмяШапки<>Неопределено И Макет<>Неопределено Тогда Шапка=Макет.ПолучитьОбласть(ИмяШапки); Если ПараметрыШапки<>Неопределено Тогда Шапка.Параметры.Заполнить(ПараметрыШапки); КонецЕсли; Т.Вывести(Шапка); Иначе //выводим шапку непосредственно в ячейки Для Каждого Кол ИЗ ТЗ.Колонки Цикл Заг=СокрЛП(Кол.Заголовок); Заг=?(Заг="",Кол.Имя, Заг); Т.Область(НачальнаяСтрока, 1+ТЗ.Колонки.Индекс(Кол), НачальнаяСтрока, 1+ТЗ.Колонки.Индекс(Кол)).Текст=Заг; КонецЦикла; КонецЕсли; Для Каждого Стр ИЗ ТЗ Цикл Если ИмяСтроки<>Неопределено И Макет<>Неопределено Тогда Строка=Макет.ПолучитьОбласть(ИмяСтроки); Строка.Параметры.Заполнить(Стр); Т.Вывести(Строка); Иначе //выводим строки Для Каждого Кол ИЗ ТЗ.Колонки Цикл Т.Область(НачальнаяСтрока+1+ТЗ.Индекс(Стр), 1+ТЗ.Колонки.Индекс(Кол), НачальнаяСтрока+1+ТЗ.Индекс(Стр), 1+ТЗ.Колонки.Индекс(Кол)).Текст=Стр[Кол.Имя]; КонецЦикла; КонецЕсли; КонецЦикла; Если ИмяПодвала<>Неопределено И Макет<>Неопределено Тогда Подвал=Макет.ПолучитьОбласть(ИмяПодвала); Если РасчитыватьИтоги=истина Тогда ПараметрыИтогов=Новый Структура(); Для Каждого Кол ИЗ ТЗ.Колонки Цикл ПараметрыИтогов.Вставить(Кол.Имя, ТЗ.Итог(Кол.Имя)); КонецЦикла; Подвал.Параметры.Заполнить(ПараметрыИтогов); КонецЕсли; Если ПараметрыПодвала<>Неопределено Тогда Подвал.Параметры.Заполнить(ПараметрыПодвала); КонецЕсли; Т.Вывести(Подвал); КонецЕсли; Если Показывать Тогда Т.Показать(ЗаголовокОкна); КонецЕсли; Возврат Т; #КонецЕсли КонецФункции ТЗ=Новый ТаблицаЗначений(); ТЗ.Колонки.ДОбавить("Четное"); ТЗ.Колонки.ДОбавить("Р3"); ТЗ.Колонки.ДОбавить("Р7"); Для Инд = 1 по 1000 Цикл Р3 = ПоискДелителя(Инд, 3); Р7 = ПоискДелителя(Инд, 7); Стр=ТЗ.Добавить(); Стр.Четное = Инд % 2 = 0; Стр.Р3 = Р3 - Инд; Стр.Р7 = Р7 - Инд; КонецЦикла; ТЗ.Свернуть("Четное, Р3, Р7", ""); ТЗ.Сортировать("Р3, Р7"); ___обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ)); Получил ТЗ: Четное Р3 Р7 ложь истина ложь 1 истина 1 истина 2 ложь 2 ложь 3 истина 3 истина 4 ложь 4 ложь 5 истина 5 ложь 6 истина 6 ложь 1 истина 1 истина 1 1 ложь 1 1 ложь 1 2 истина 1 2 ложь 1 3 истина 1 3 ложь 1 4 истина 1 4 ложь 1 5 истина 1 5 ложь 1 6 истина 1 6 истина 2 ложь 2 ложь 2 1 истина 2 1 ложь 2 2 истина 2 2 ложь 2 3 истина 2 3 ложь 2 4 истина 2 4 истина 2 5 ложь 2 5 истина 2 6 ложь 2 6 Не, не канает, от делителей 3 и 7 на одинаковом растоянии всегда есть и четные и нечетные числа |
|||
81
Гений 1С
гуру
23.07.08
✎
21:57
|
(76) Это ты кому?
|
|||
82
Гений 1С
гуру
23.07.08
✎
21:59
|
ТЗ=Новый ТаблицаЗначений();
ТЗ.Колонки.ДОбавить("Четное"); ТЗ.Колонки.ДОбавить("Р3"); ТЗ.Колонки.ДОбавить("Р7"); ТЗ.Колонки.ДОбавить("Р3_2"); ТЗ.Колонки.ДОбавить("Р7_2"); Для Инд = 1 по 1000 Цикл Р3 = ПоискДелителя(Инд, 3); Р7 = ПоискДелителя(Инд, 7); Р3_2 = ПоискДелителя(Р7, 3); Р7_2 = ПоискДелителя(Р3, 7); Стр=ТЗ.Добавить(); Стр.Четное = Инд % 2 = 0; Стр.Р3 = Р3 - Инд; Стр.Р7 = Р7 - Инд; Стр.Р3_2 = Р3_2 - Инд; Стр.Р7_2 = Р7_2 - Инд; КонецЦикла; ТЗ.Свернуть("Четное, Р3, Р7, Р3_2, Р7_2", ""); ТЗ.Сортировать("Р3, Р7, Р3_2, Р7_2"); Все то же самое, блин... |
|||
83
wertyu
23.07.08
✎
22:00
|
(80) а чем тебя тогда Чётное = (Число % 2 = 0) не устраивало?
|
|||
84
Kiber
23.07.08
✎
22:01
|
Ну, если циклы разрешены, то не легче-ли от осходного числа отнимать ближайшуюю степень числа 2, пока оно не станет равным 0 или 1? =)
|
|||
85
wertyu
23.07.08
✎
22:02
|
(84) уже даже "%" разрешено :)))))
|
|||
86
Гений 1С
гуру
23.07.08
✎
22:03
|
(83) ты не в теме, отдыхай дальше... Это не вопрос, как проверить четность в 1с, это вопрос, можно ли арифметически проверить четность и трудоемкость этого алгоритма.
|
|||
87
AAZ
23.07.08
✎
22:03
|
http://www.college.ru/mathematics/courses/algebra/content/chapter1/section1/paragraph3/theory.html
Признаки делимости Признак делимости на 2. Число, делящееся на 2, называется чётным, не делящееся на 2 – нечётным. Число делится на 2 тогда и только тогда, когда его последняя цифра делится на 2. Признак делимости на 5. Число делится на 5 тогда и только тогда, когда его последняя цифра – 5 или 0. Признак делимости на 25. Число делится на 25 тогда и только тогда, когда две его последние цифры либо нули, либо образуют число, делящееся на 25. Признаки делимости на 10, 100, 1000. Число делится на 10 тогда и только тогда, когда его последняя цифра – 0. Число делится на 100 тогда и только тогда, когда две его последние цифры – нули. Число делится на 1000 тогда и только тогда, когда три его последние цифры – нули. Признак делимости на 4. Число делится на 4 тогда и только тогда, когда две его последние цифры – нули, либо когда двузначное число, образованное двумя его последними цифрами, делится на 4. Признак делимости на 3. Число делится на 3 тогда и только тогда, когда сумма его цифр делится на 3. Признак делимости на 9. Число делится на 9 тогда и только тогда, когда сумма его цифр делится на 9. Признак делимости на 11. Число делится на 11 тогда и только тогда, когда сумма его цифр, стоящих на нечётных местах, либо равна сумме цифр, стоящих на чётных местах, либо отличается от неё на число, кратное 11. |
|||
88
Гений 1С
гуру
23.07.08
✎
22:04
|
(84) С циклом решение известно. Трудоемкость log 10 (N). Надо быстрее.
(85) С какого бодуна? Я не разрешал |
|||
89
Гений 1С
гуру
23.07.08
✎
22:04
|
(87) Ты к чему это ляпнул? Сказал А говори и Б, или не флудераствуй.
|
|||
90
wertyu
23.07.08
✎
22:05
|
(88) на свой код посмотри....
|
|||
91
AAZ
23.07.08
✎
22:06
|
(89) Это к вопросу от делимости на 3 (ну, и т.д.)
|
|||
92
Гений 1С
гуру
23.07.08
✎
22:06
|
(90) Мой код не решение, а исследование расстояния... Не путай мелкое с теплым
|
|||
93
Гений 1С
гуру
23.07.08
✎
22:06
|
(91) В твоем сабже я не нашел ни слова про периодические дроби, которые получаются при делении на 3 и 7.
|
|||
94
Kiber
23.07.08
✎
22:08
|
Точнее легче по другому
Перем ИсходноеЧисло, Дельта, СтепеньДвойки; ТеньЧисла = 0; Пока (ИсходноеЧисло-ТеньЧисла) > 1 Цикл СтепеньДвойки = 1; Пока (ТеньЧисла+2^СтепеньДвойки) < ИсходноеЧисло Цикл СтепеньДвойки = СтепеньДвойки+1; КонецЦикла; ТеньЧисла = ТеньЧисла + 2^(СтепеньДвойки-1); КонецЦикла; Если ИсходноеЧисло = ТеньЧисла Тогда Возврат("Чет"); Иначе Возврат("Нечет"); КонецЕсли; |
|||
95
Гений 1С
гуру
23.07.08
✎
22:08
|
(94) Хватит извращаться с циклами. такое решение мы знаем и его трудоемкость LOG 10 (N). Нужно что-то пооригинальнее.
|
|||
96
wertyu
23.07.08
✎
22:10
|
(92) про периодические дроби можно было вообще не упоминать - для простых чисел длина периода равна p - 1, т.е. цикл даже длиннее, чем при факторизации числа
|
|||
97
Asirius
23.07.08
✎
22:12
|
(0) ответ на (149) из пред. топика.
Сам обломись! А кто мешает нам запускать функцию, написанную с ограничениями из (0) не только на натуральных числах, но и на вещественных??? Вот ты накодил эту функцию ПроверкаЧетности(ПроверяемоеЧисло) для целых чисел, а я потом, как самый злостный бета-тестер, возьму и запущу: Сообщить(ПроверкаЧетности(1.239)) Какой результат она мне выдаст???? Повиснет? В лучшем случае вылетит ошибка деления на 0, но и то эта ошибка может вылетать только на конечном количестве отрезков вещественных чисел! |
|||
98
Kiber
23.07.08
✎
22:12
|
(95)
Самое оригинальное решение было предложено с транком, но вы-же его отмели. Объясни суть вопроса, поставь задачу нормально. Ведь ты явно не собираешься в стотыщмиллиардой базе данных выяснять - целые там числа, или нет. В 77 ИМХО вы не найдете решения пооригинальнее. Кстати, по поводу (94) - проверь, сколько итераций будет выполнено. Полагаю, сильно удивишься. Ведь не зря вся маш. логика изначально двоична. |
|||
99
Гений 1С
гуру
23.07.08
✎
22:18
|
Можно пойти еще таким путем.
Делим число X на 2 затем умножаем число на 10, получаем число, заканчивающееся на 0 или 5. Теперь отнимаем единицу, получаем число, заканчивающееся на 9 или 4. Дальше вот не знаю, надо найти ближайшее число, делящееся на 3 что ли? |
|||
100
Гений 1С
гуру
23.07.08
✎
22:19
|
(97) Блин, ну это ущербная логика программиста, не умеющего работать по ТЗ. Тебе сказали - проверяем только натуральные числа. Такова суть задачи!
|
|||
101
wertyu
23.07.08
✎
22:19
|
сто
|
|||
102
Гений 1С
гуру
23.07.08
✎
22:20
|
(98) Это не практическая задача, а интеллектуальная, для развития мозгов. Как на практике проверить четность я знаю - с помощью оператора %
|
|||
103
Гений 1С
гуру
23.07.08
✎
22:20
|
(101) мазилло
|
|||
104
Гений 1С
гуру
23.07.08
✎
22:34
|
Блин, уже поздно, но можно вот такой вариант посмотреть. Уже не шарит голова, завтра.
Значитца, если проверяем на четность Х. Берем Х + (Х + 1) * 2 + 1 = 3 * Х + 3 = K Далее, делим К на 2 и проверяем делимость на 3. |
|||
105
Гений 1С
гуру
23.07.08
✎
22:39
|
Итак, точнее, берем С = (3 * Х + 3) / 2
для 5, С = 9 делится на 3, нечетное для 6, С = 8.5 не делится на 3, четное для 7, К = 12, делится на 3, нечетное для 8, К = 13.5, не делится на 3, четное для 9, К = 15, делится на 3, нечетное для 10, К = 16.5, не делится на 3, четное Гыгыгы |
|||
106
Гений 1С
гуру
23.07.08
✎
22:39
|
Ну что, мазафакеры, кто тут гений...
Все, задача решена, все неверующие идут глубоко в сад... |
|||
107
Гений 1С
гуру
23.07.08
✎
22:40
|
Как проверять деление на 3 я уже знаю и рассказывал...
итого за конечное число действий мы проверяем нечетность числа.. |
|||
108
Гений 1С
гуру
23.07.08
✎
22:43
|
Итак, вот моя статья для дневника:
У меня возник вопрос, как проверить, четное число или нет, только с помощью математических операций +, -, *, /, причем без использования циклов, буквально за пару действий на компьютере с ограниченной разрядностью. Долго бился над решением и все таки его нашел. Допустим, мы проверяем число Х. Берем С = (3 * Х + 3) / 2. Если С делится на 3, тогда число нечетное, если не делится, тогда четное. Например: для 5, С = 9 делится на 3, нечетное для 6, С = 8.5 не делится на 3, четное для 7, К = 12, делится на 3, нечетное для 8, К = 13.5, не делится на 3, четное для 9, К = 15, делится на 3, нечетное для 10, К = 16.5, не делится на 3, четное А как проверить, делится ли число на 3? Учитывая, что разрядность компьютера ограничена, мы сначала делим Х на 3, а затем умножаем на 3, получаем К. Если К = Х, то число делится на 3, иначе не делится. Вот все, вопрос решен. |
|||
109
wertyu
23.07.08
✎
22:44
|
(107) и как же проверить делимость на 3? если как в (48) + (53) - это несерьёзно.....
|
|||
110
Гений 1С
гуру
23.07.08
✎
22:46
|
(109) Читай полностью в 108. Вуаля, я решил задачу, мозг освободился от нее, гы, ларчик просто открывался!
|
|||
111
wertyu
23.07.08
✎
22:47
|
(110) я там не вижу проверки делимости на 3
|
|||
112
wertyu
23.07.08
✎
22:51
|
+(111) - 16.5/3*3 = 16.5 выдаёт Истина, думай дальше
|
|||
113
SternZ
23.07.08
✎
22:58
|
(108)
Блин, и смех и грех ... |
|||
114
Гений 1С
гуру
23.07.08
✎
22:58
|
(112) Надо тогда проверить три подряд идущих числа по этому сценарию Х, Х+1 и Х+2
|
|||
115
Гений 1С
гуру
23.07.08
✎
23:00
|
или протестировать ряд из Х, Х+2, Х+4, Х+6, Х+8, Х+10 и кто из них даст больше (избавляемся от ошибки), то и ок
|
|||
116
SternZ
23.07.08
✎
23:05
|
Что ж у Вас не возникает этого вопроса к разработчикам С++ или С#...
Да грамотно релизуйте операцию % ... в нее все и войдет... Или нет ? |
|||
117
wertyu
23.07.08
✎
23:06
|
(115) в общем ты уже пытаешься без рекурсии число факторизовать....
|
|||
118
wertyu
23.07.08
✎
23:10
|
(116) % нельзя использовать, а И в 1с с числами работает вот так: Число1 И Число2 = Ложь, только если одно из них или оба равны 0, во всех остальных случаях Истина
|
|||
119
Гений 1С
гуру
23.07.08
✎
23:11
|
(116) перечитайте ветку,лень чисто вам объяснять банальности
|
|||
120
SternZ
23.07.08
✎
23:14
|
Для любого нормального языка программирования такого вопроса нет...
Решается все на уровне реализации операторов .. Бред какой-то... |
|||
121
Гений 1С
гуру
23.07.08
✎
23:14
|
(112) мда, засада... ;-)
|
|||
122
Гений 1С
гуру
23.07.08
✎
23:15
|
(120) Блин, специально для тебя, военного программиста - это не задача языка программирования, это логическая задача... Народ, ну объясните ему...
|
|||
123
Kiber
23.07.08
✎
23:17
|
(108)
>>> для 10, К = 16.5, не делится на 3, четное Неверно. Все представленные тобой числа делятся на 3. Представь себе 1.5 /3 = 0.5 *3 = 1.5 |
|||
124
Kiber
23.07.08
✎
23:20
|
И опять-же, все проверки на делимость (например, на 3) основаны на ограниченности вычислений.
Но калькуляторы-то умнеют, и сейчас, я думаю что если ты на хорошем калькуляторе 5 разделишь на 3, а затем умножишь ты получишь не 4,(9) а 5. В реальной математике ни для одного числа нельзя проверить делимость без циклов. Имхо. |
|||
125
Kiber
23.07.08
✎
23:21
|
*реальной понимать как абсолютной или точной.
|
|||
126
SternZ
23.07.08
✎
23:23
|
Так умножьте логически на 1 - и проблем :)
|
|||
127
Гений 1С
гуру
23.07.08
✎
23:36
|
(124) речь идет о машинах с ограниченной разрядностью. Они никогда не будут выдавать для 5 / 3 * 3 число 5
|
|||
128
Гений 1С
гуру
23.07.08
✎
23:36
|
(123) да, ступил
|
|||
129
Гений 1С
гуру
23.07.08
✎
23:37
|
(126) точнее плиз
|
|||
130
Asirius
23.07.08
✎
23:39
|
(97) Это не ушербность, а доказательство невозможности написания такой функции при помоши расширения ее поля действия.
Ты еще назови ущербным человека, который стал извлекать корень из -1 и придумавшего комплексные числа. (108) А вот тут липа! Для начала ты определись, чисто математическая задача это, или все таки учитываем погрешности вычислений? К тому же, ограниченная разрядность вовсе не означает, что 1/3*3 <> 1. Если вдруг кодеры платформы 1C возьмут в новой версии за основу в вычислениях движок от Mathcad, там 1/3 в памяти хранится не как 0.333...3 а именно как дробь 1/3 со всеми вытекающими... |
|||
131
SternZ
23.07.08
✎
23:41
|
Хорошо.
Похоже, 1С не знает операции логического умножения... Я недавно занимаюсь 1С :) |
|||
132
Asirius
23.07.08
✎
23:42
|
(127) ты не поверищь, в mathcad-е даже sqrt(2)*sqrt(2) = 2
|
|||
133
Гений 1С
гуру
23.07.08
✎
23:43
|
(130) Хорошо. Интересно, есть ли решение трудоемкостью быстрее чем LOG 10 N в двух случаях:
1. Для чистой арифметики, где X / 3 * 3 всегда равно X 2. Для компьютеров, использующих особености вычислений, где X / 3 * 3 равно X только если X нацело делится на 3. ;-) |
|||
134
Гений 1С
гуру
23.07.08
✎
23:43
|
(130) (132) Такая постановка удовлетворит?
|
|||
135
Гений 1С
гуру
23.07.08
✎
23:46
|
По сути действительно, задача сводится к другой:
Функция Четность(Х) Возврат ЭтоЦелоеЧисло(Х/2); КонецФункции Таким образом можно размышлять только о способе проверки числа на целое, хотя эти числа могут заканчиваться только на *.5 или на *.0 |
|||
136
Гений 1С
гуру
23.07.08
✎
23:53
|
Кстати, есть такой тупой алгоритм, но у него тоже цикл:
Функция ЭтоЧетное(Х) Р = БлижайшееДелящеесяНа3Слева(Х); Д = Х - Р; Ч = ЭтоЧетное(Д/3); Если Ч и (Д = 0 ИЛИ Д = 2) Тогда Возврат истина КонецЕсли; Если Ч и (Д = 1) Тогда Возврат ложь КонецЕсли; Если НЕ Ч и (Д = 0 ИЛИ Д = 2) Тогда Возврат ложь КонецЕсли; Если НЕ Ч и (Д = 1) Тогда Возврат истина КонецЕсли; КонецФункции |
|||
137
Asirius
24.07.08
✎
00:01
|
(133)
1. Нельзя. Вникай в док-во (148) из прошлой ветки. 2. Вот тут скорее всего можно, надо подумать.. |
|||
138
SternZ
24.07.08
✎
00:03
|
Число AND 0x1 - в зависимости от четного или нечетного числа отличается ?
|
|||
139
SternZ
24.07.08
✎
00:04
|
(129) Куда точнее ?
|
|||
140
SternZ
24.07.08
✎
00:08
|
Уж четность совершенно необязательно определять арифметическими операциями - здесь битики :)
|
|||
141
Яндекс
24.07.08
✎
06:43
|
(133)
для идиотов которые создают алгоритмы нарушая своиже собственные ограничения... в 1С следующее равенство справедливо всегда х = (х / 3) * 3 ... независимо от твоего бреда (1 / 3) * 3 = 1 (2 / 3) * 3 = 2 (3 / 3) * 3 = 3 |
|||
142
Kiber
24.07.08
✎
09:02
|
(141)
Он поставил задачу с учетом ограничений и возможностей накладываемых компьютером и языком 1с. И ругаешься ты очень зря, так как всего-лишь повторил содержание постов выше, добавив ругань. Очень, очень плохо. |
|||
143
Яндекс
24.07.08
✎
09:32
|
(142)какие ограничения для определения четности числа на тебя накладывает компьютер и язык 1С?
|
|||
144
Serg_1960
24.07.08
✎
09:35
|
Пока гении 1С почивают:
Если из Х, используя комбинацию арифметических операции, можно получить такое Y, для которого, используя обратную комбинацию операций, можно получить не Х, то Вы "... и гений, парадоксов друг ...". PS: А афтору смените ник на "Геев Парадоксов Друг" :о) От создателя алгоритма Возврат СтрЧислоВхождений(Число/2, Сред(0.1,2,1)); Еще одна "нетленка" под девизом "О боже - ОНО работает...": Функция ЧетноеЧисло(Число) Экспорт Индекс = ?(Число<0, -Число, +Число); Массив = Новый Массив(2); Массив[0]=Истина; Массив[1]=Ложь; Попытка Возврат Массив[Индекс]; Исключение ЭтоНеЯЭто1СОкругляет = Новый Массив(Индекс/2); Возврат Массив[Число(ЭтоНеЯЭто1СОкругляет.Количество()*2<>Индекс)]; КонецПопытки; КонецФункции; PS: и не ругайтесь сильно, - я сам пойду УППоплюсь! |
|||
145
dimaldinho
24.07.08
✎
09:43
|
(108) "Учитывая, что разрядность компьютера ограничена..." - это неявное округление. Такой подход не отличается от A=(X/2); B=2*A; X?=B, когда разрядность переменной А равна нулю. Стыдно, товарищ.
|
|||
146
ShoGUN
24.07.08
✎
09:52
|
Короче, все извращения нужны, чтобы реализовать операцию выделения целой части.(Или аналогичную) Без нее решить ни у кого не получается.
|
|||
147
kosts
24.07.08
✎
09:53
|
Я думаю это не сработает для любого числа которое 1С может использовать
Например 10000000000000000000000000000000000000000000000000000000000000000000000 |
|||
148
Гений 1С
гуру
24.07.08
✎
09:55
|
(141) Для яндекс-дятла. Набери в табло 1С: (1 / 3) * 3 и получишь 0,999999999999999999999999999
|
|||
149
Гений 1С
гуру
24.07.08
✎
09:56
|
(143) Идиот, речь не о практической задаче, а о головоломке... По-моему условия задачи уже кристально чисты. Решения пока еще нет, ровно как и доказательства его отсутствия. Есть решение трудоемкостью LOG 10 (N)
|
|||
150
Гений 1С
гуру
24.07.08
✎
09:57
|
(144) Читай (147) молодой зеленый человечек.
|
|||
151
Яндекс
24.07.08
✎
09:57
|
(148)для гей-дятла... я тебе из табло сообщения и показал...
|
|||
152
ShoGUN
24.07.08
✎
09:57
|
(148) Не сработает в троичной системе счисления! :)
|
|||
153
Гений 1С
гуру
24.07.08
✎
09:58
|
(145) А ты попробуй реши задачу не с явным округлением, а с неявным. Решишь - дам медаль, гыгыгыы... Типо от того что это округление неявное, условие облегчается... Харе возбухать по поводу условия, так и скажи - не Ферма, я, мол, как решить не знаю... А то только трендеж.
|
|||
154
Яндекс
24.07.08
✎
09:59
|
(149)баран ... ты сам запретил использовать другие функции и циклы
|
|||
155
Гений 1С
гуру
24.07.08
✎
09:59
|
(151) Ты в 7.7 проверял или в 8.0? гыгыгы... Не суди о других по себе, узкоклювый
|
|||
156
Гений 1С
гуру
24.07.08
✎
10:01
|
(154) ладно, обзываться некрасиво, больше небуду. Но яндекс тупит, увы.
|
|||
157
Яндекс
24.07.08
✎
10:01
|
(155)иплан а где в условии сказано, что надо 8.х ... так что либо учись формулировать задачи широкозадый... либо в школу учить математику
|
|||
158
Яндекс
24.07.08
✎
10:03
|
(156)до товего тупняка мне еще далеко
|
|||
159
kosts
24.07.08
✎
10:05
|
Пока все решают основную задачу можно параллельно найти самое короткое решение
Тут предложили Возврат СтрЧислоВхождений(Число/2, Сред(0.1,2,1)); Можно укоротить Возврат СтрЧислоВхождений(Число/2, Сред(0.5,2)); Есть еще короче? (Пробелы не считать) |
|||
160
Яндекс
24.07.08
✎
10:09
|
возврат найти(число/2, сред(.5, 2))
|
|||
161
Fynjy
24.07.08
✎
10:25
|
Мдя ... Что сказать "генИй" ... Сам ставит правила ... Сам их нарушает ...
|
|||
162
Fragster
гуру
24.07.08
✎
10:36
|
кстати,
Если Синус(НашеЧисло* Пи/2) = 1 Тогда четное Иначе нечетное КонецЕсли |
|||
163
Fragster
гуру
24.07.08
✎
10:37
|
(162), вернее наоборот
|
|||
164
ShoGUN
24.07.08
✎
10:41
|
Кстати, с возведением в степень X можно, но это опять же цикл.
|
|||
165
Fragster
гуру
24.07.08
✎
10:46
|
(164) да нет, просто определение числа четного и нечетного - рекурсивное через сложение и умножение, так что определить четное ПРОИЗВОЛЬНОЕ число или нет, можно только используя циклы, или циклические функции... ну или операцию ОСТАТКА от деления
|
|||
166
vde69
24.07.08
✎
10:46
|
(164) так?
Если Pow(-1, Число) = 1 Тогда сообщить("Чет"); Иначе сообщить("НеЧет"); КонецЕсли |
|||
167
Fragster
гуру
24.07.08
✎
10:47
|
(165)+ а если число не произвольное - то тогда уж способов море
|
|||
168
ShoGUN
24.07.08
✎
10:53
|
(165) И я про то же.
(166) Ну да. |
|||
169
Fragster
гуру
24.07.08
✎
11:02
|
(168) хотя, можно разложить конечное число шагов разложения синуса в ряд фурье, и сравнивать с 0.5... получится один из приемов оптимизации из экстремального программирования... шагов 7-8 будет достаточно для не очень больших чисел ;)
|
|||
170
Fragster
гуру
24.07.08
✎
11:05
|
(169) в смысле, использовать конечное число итераций вычисления ряда фурье - записать их линейно, и все... там как раз только *,+ и - получается.
|
|||
171
Fynjy
24.07.08
✎
11:07
|
162 и 166 наиболее близко подошли к решению задачи :) Теперь надо добить решение примитивными действиями :)
|
|||
172
ShoGUN
24.07.08
✎
11:08
|
(170) О :) Грамотно... Тем более, что синус так и вычисляется.
|
|||
173
Fragster
гуру
24.07.08
✎
11:09
|
(171) а что тут добивать? просто гуглить про ряд синуса мне лень...
|
|||
174
ShoGUN
24.07.08
✎
11:12
|
||||
175
Fragster
гуру
24.07.08
✎
11:14
|
Гений, ты где???? скажи нам, что здесь не так? :))))
|
|||
176
Fynjy
24.07.08
✎
11:20
|
Только степень без цикла ну ни как не выразишь.
|
|||
177
Fynjy
24.07.08
✎
11:21
|
(-1) в степени нашего числа это большой цикл.
|
|||
178
Fragster
гуру
24.07.08
✎
11:22
|
(176) причем здесь степень? вы ряды фурье обосрите :)
|
|||
179
ShoGUN
24.07.08
✎
11:23
|
(176) Произвольную степень - никак, но тут-то надо конечное количество членов. И вместо равенства единице проверять скажем на (>0.9). Формально можно реализовать без цикла.
|
|||
180
Fragster
гуру
24.07.08
✎
11:28
|
(179)+ надо проверять принадлежность (-0.5,0.5) - тогда четное. а поскольку наш вычисляемый ряд - для значений, для которых полный ряд 0 или 1 - то длина ряда может быть не очень большой.
|
|||
181
vde69
24.07.08
✎
11:32
|
(180) мне кажется, что с синусом можно и обычной тригонометрией выразить...
|
|||
182
Fragster
гуру
24.07.08
✎
11:34
|
(181) не понял, чем синус от обычной тригонометрии отличается?
|
|||
183
ShoGUN
24.07.08
✎
11:39
|
+(182) И что такое "необычная тригонометрия"? :)
|
|||
184
wertyu
24.07.08
✎
11:53
|
(182) у ряд Тейлора для синуса нужен цикл ещё больший чем даже перебор от 1 до числа
|
|||
185
Яндекс
24.07.08
✎
11:52
|
|
|||
186
vde69
24.07.08
✎
11:54
|
(182) я имел школьный курс, что-то не выходит )
|
|||
187
ShoGUN
24.07.08
✎
11:57
|
(184) Эээ... С какого? Для вычисления первых 7-8 членов ряда формула будет не такая уж и большая. Явно меньше действий, чем перебор от 1 до миллиона, например...
|
|||
188
wertyu
24.07.08
✎
12:01
|
(187) попробуй например для 10000....
|
|||
189
wertyu
24.07.08
✎
12:02
|
+(188) я думаю, что разрядности очень быстро не хватит....
|
|||
190
wertyu
24.07.08
✎
12:03
|
+(189) ряд то знакопеременный, поэтому для 10000 первые 7000 слагаемых будут достаточно большими по модулю
|
|||
191
ShoGUN
24.07.08
✎
12:04
|
(189) Какая задача - такое и решение ;)
|
|||
192
Fragster
гуру
24.07.08
✎
12:06
|
(185) баян. гений сказал, что "неявное округление" и вся фигня...
|
|||
193
ShoGUN
24.07.08
✎
12:06
|
(190) Какие нахрен 7000 слагаемых?
|
|||
194
Fragster
гуру
24.07.08
✎
12:06
|
(191) +111111111111111111111111111111111111111111111111111111адынадын!нечетное1
|
|||
195
wertyu
24.07.08
✎
12:08
|
(193) для 10000 их будет гораздо больше
|
|||
196
Fragster
гуру
24.07.08
✎
12:09
|
(190) там делится на факториал, вообщето. 10! = 3628800, т.е. для числа до миллиона 10 слагаемых хватит
|
|||
197
Fragster
гуру
24.07.08
✎
12:09
|
(196), хотя гоню
|
|||
198
wertyu
24.07.08
✎
12:10
|
+(195) слагаемых по количеству больше чем число, проверь на числе 10
|
|||
199
Fragster
гуру
24.07.08
✎
12:11
|
(198) ну задача-то все равно решение принципиальное имеет, так что...
|
|||
200
wertyu
24.07.08
✎
12:12
|
+(198) задача сведётся к выделению целых 2*pi - т.е. шило на мыло
|
|||
201
Asirius
24.07.08
✎
12:12
|
(134) Короче, в формулировке опять много неточностей... неясно как быть с условием проверки типа (1/3)/3 *3 = 1/3 ?
Можно переформулировать задачу так: К разрешенным операциям +,-,/,* добавляются операции проверки на делимость на любое простое p, отличное от 2 и 5. Т.е. добавляется такая функция mod(x, p), p <> 2 и <>5 где для любого десятичного числа типа x=y/10^n, когда y делится на p mod(x,p) =1 иначе mod(x,p) =0 |
|||
202
Asirius
24.07.08
✎
12:16
|
(201) так вот, в такой формулировке решения не существует.
Доказательство посложнее, чем с запретом такой функции, может вечером выложу. Суть в том, что из информации об остатках при делении x на простые числа>2, никак нельзя получить информацию о четности числа. Это следует из теоремы Эйлера. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |