Имя: Пароль:
IT
 
Можно ли в 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

//*******************************************
функция ЧетНеЧет2(чисЗнач)
   тзТемп.Целое = чисЗнач / 2;
   если (тзТемп.Целое * 2) = чисЗнач тогда
       возврат "четное";
   иначе
       возврат "нечетное";
   конецесли;
конецфункции

//*******************************************
тзТемп = создатьобъект("ТаблицаЗначений");
тзТемп.НоваяКолонка("Целое", "число", 255, 0);
тзТемп.НоваяСтрока();

//*******************************************
для ВыбЧисло = 99999999999999999999999999999999999999999999999990 по 99999999999999999999999999999999999999999999999999 цикл
   сообщить(ЧетНеЧет2(ВыбЧисло));
конеццикла

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, никак нельзя получить информацию о четности числа. Это следует из теоремы Эйлера.
AdBlock убивает бесплатный контент. 1Сергей