![]() |
![]() |
![]() |
|
Можно ли в 1С проверить, четное чиСло или нет без Цел и циклов? Ø (длинная ветка 23.07.2008 15:24) |
☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
21.07.08
✎
22:10
|
Используя только ограниченное количество операции +, -, *, / и условий?
|
|||
1
Guk
21.07.08
✎
22:11
|
МоёЧисло%2=0 - четное...
|
|||
2
KLF
21.07.08
✎
22:12
|
%2
|
|||
3
Гений 1С
гуру
21.07.08
✎
22:36
|
(1)(2) Операция % запрещена, читать умеем? Чисто математическая задача
|
|||
4
MTM777
21.07.08
✎
22:43
|
(0) помнится был такой топик.. :))) поисчи..
|
|||
5
Guk
21.07.08
✎
22:45
|
(3) В 1С операция % запрещена? Да ты окончательно спятил...
|
|||
6
MTM777
21.07.08
✎
22:46
|
держи v8: Как узнать - Четное число или нет?
там стока вариантов..)) |
|||
7
Fynjy
21.07.08
✎
22:46
|
(3) Формула четного и нечетного числа
2п и 2п+1 соответственно. Думай ... |
|||
8
MTM777
21.07.08
✎
22:47
|
(5) он же извращенец..))
|
|||
9
Fynjy
21.07.08
✎
23:01
|
||||
10
Fynjy
21.07.08
✎
23:01
|
Оттуда ...
* Сложение и вычитание: o чётное ± чётное = чётное o чётное ± нечётное = нечётное o нечётное ± чётное = нечётное o нечётное ± нечётное = чётное * Умножение: o чётное ? чётное = чётное o чётное ? нечётное = чётное o нечётное ? чётное = чётное o нечётное ? нечётное = нечётное * Деление: o чётное / чётное — может быть любым o чётное / нечётное = чётное, если целое o нечётное / чётное — не может быть целым o нечётное / нечётное = нечётное, если целое |
|||
11
Гений 1С
гуру
21.07.08
✎
23:03
|
(6) спасибо, именно чтение этого топика меня и натолкнуло на данную алгоритмическую проблему.
(5) Меня интересует не практическая, а теоретическая сторона. Сегодня ехал в электричке - голову сломал. Можно ли используя только сложение, умножение, деление и вычитание и ограниченное число действий, не пропорциональное проверяемому числу, проверить, четное оно или нет? Вот о чем топик. |
|||
12
vde69
21.07.08
✎
23:24
|
Функция Чет (х)
Результат = х; Если (х\2) >= 2 Тогда Результат = Функция Чет (Результат/2); КонецЕсли; возврат Результат КонецФункции; Если Чет(МоеЧисло)=1 Тогда Сообщить("Четное"); Иначе Сообщить("НЕ Четное"); КонецЕсли; формально циклов нету ))) |
|||
13
Asirius
21.07.08
✎
23:24
|
(0) Нельзя.
Если закрыть глаза на точность вычислений 1C, то при помощи разрешенных операций даже целое от не целого неотличишь - их конечное количество и можно построить функцию только с конечным количеством корней. |
|||
14
Лефмихалыч
21.07.08
✎
23:41
|
(7) пять баллов! :))
нет, честно, я бы более изящно накуй не послал :) |
|||
15
ЗлобнийМальчик
21.07.08
✎
23:51
|
(12) рекурсия и цикл - это по сути одно и тоже, тока написано по другому
|
|||
16
kosts
22.07.08
✎
08:17
|
Что, никто не решил, думали нельзя, а вот и можно...
а = 23; б = 1/2; с = а/2; д = "" + с + "" + б; е = а / 2 * 10 + б; ф = "" + е; Если а = 0 или (д = ф) тогда Сообщить (" Четное"); Иначе Сообщить (" Нечетное"); КонецЕсли; Без циклов, без Цел, только * / + 1С это не теоретическая математика у нее свои правила :-) |
|||
17
DGorgoN
22.07.08
✎
08:28
|
(16) Поясни
|
|||
18
ЛНТ
22.07.08
✎
08:29
|
(16) бред, преобразуй число a/2 в строку и сравни правые 2 символа с ".5" результат тот же
|
|||
19
kosts
22.07.08
✎
08:37
|
(18) Ни че не бред - в таком случае я могу сразу сравнить правый символ с "2"
Попробуй сравнить и с ".5" без функций. Оно может и можно упростить, но это уже детали |
|||
20
kosts
22.07.08
✎
08:39
|
(17) Что именно не понятно?
|
|||
21
Skom
22.07.08
✎
08:42
|
Цифирь = ТвоеЦифирь;
Исчем = Число(Прав(Цифирь,1)); Если (Исчем = 0) или (Исчем = 2) или (Исчем = 4) или (Исчем = 6) или (Исчем = 8) Тогда ЧЕТНОЕ КонецЕсли; |
|||
22
Skom
22.07.08
✎
08:42
|
ну и проверку на 0 сделай
|
|||
23
Skom
22.07.08
✎
08:43
|
что то типа этого вроде
это если ты не рассматриваешь дробные числа как четные и нечетные... ну то есть не дробные а рассматриваешь только целые |
|||
24
ЛНТ
22.07.08
✎
08:43
|
(19) ты операцию конкатенации со сложением спутал
|
|||
25
ЛНТ
22.07.08
✎
08:45
|
>>Skom по-твоему преобразование строки в число и обратно по какому алгоритму работает? без циклов?
|
|||
26
kosts
22.07.08
✎
08:46
|
(21) На счет других функций автор ничего не сказал, так что думаю вариантов еще можно попридумывать :-)
|
|||
27
kosts
22.07.08
✎
08:52
|
(24) В условии не запрещено использовать конкатенацию
|
|||
28
ЛНТ
22.07.08
✎
08:54
|
(27) маладец
|
|||
29
kosts
22.07.08
✎
08:54
|
(25) А если разобраться то и операция деления (/) не обходится без циклов
|
|||
30
ЛНТ
22.07.08
✎
08:54
|
(29) еще раз маладец
|
|||
31
Skom
22.07.08
✎
09:04
|
ну в таком случае...если без циклов и без деления...могу предложить так
СкокаПроходофф = 1; Цифирь = 3; ~М1: Цифирь = Цифирь - 1; Если Цифирь = 0 Тогда Если СкокаПроходофф = 1 Тогда Сообщить("нечет"); Иначе Сообщить("чет"); КонецЕсли Иначе СкокаПроходафф = 3 - СкокаПроходафф; Перейти ~М1 КонецЕсли; что то воде етого...и без циколв и без всего... тока вычитание.... |
|||
32
Яндекс
22.07.08
✎
09:05
|
вообще в условии написано, что в 1С использовать +, -, *, / и условий ... как 1С будет их использовать в условии задачи не ограничивалось...
так что думаю kosts условия задачи выполнил... |
|||
33
Яндекс
22.07.08
✎
09:05
|
(31)а вот это уже цикл
|
|||
34
kosts
22.07.08
✎
09:07
|
(31 ) Не знаю зачтут ли т.к. похоже на цикл Перейти ~М1 :-)
|
|||
35
Skom
22.07.08
✎
09:07
|
может де то и напортачил в логике но суть думая вроде ясна....
а цклов то НЕТУ |
|||
36
Skom
22.07.08
✎
09:08
|
Используя только ограниченное количество операции +, -, *, / и условий?
все соблюдено! фактически то все понимают что цикл...но тем не менее...это не цикл а просто передача управления на оператор при несоблюдении или соблюдении какого либо условия.... хотя цикл это оно и есть |
|||
37
Яндекс
22.07.08
✎
09:09
|
(35)для тебя цикл это когда для х = 1 по 10 цикл?
|
|||
38
ЛНТ
22.07.08
✎
09:09
|
(32) он использует функции преобразования числа в строку и тем условие задачи не выполняет
|
|||
39
Bww_
22.07.08
✎
09:09
|
Если уж использовать другие функции, тогда вообще "по колхозному"
Функция ПроверкаЧетности() Если КонтрЧисло=0 Тогда Возврат ""; ИначеЕсли Найти(СокрЛП(КонтрЧисло/2),".")>0 Тогда Возврат "Не четное"; Иначе Возврат "Четное"; КонецЕсли; КонецФункции |
|||
40
kosts
22.07.08
✎
09:11
|
(39) Ноль считается четным числом
|
|||
41
Skom
22.07.08
✎
09:13
|
(37) да понимаю я что это цикл....
просто так....извратился что то |
|||
42
Яндекс
22.07.08
✎
09:19
|
(38)таково особенность одинэс... в условиях задачи использования "+" никак не ограниченно
|
|||
43
eklmn
гуру
22.07.08
✎
09:21
|
Я смотю не только фикс извращенец на мисте...
|
|||
44
ЛНТ
22.07.08
✎
09:23
|
(42) я не про + говорю, а про преобразование числа в строку
|
|||
45
Bww_
22.07.08
✎
09:32
|
(43) - это точно.
Картина напоминает рыбака кидающего в реку подкормку. Какую хрень ни кинь - все равно сбежится куча какой-то живности и будет ее теребить. Чувствуется что "гений" и народ в теме давно не был(и) в отпуске - пора! |
|||
46
Ненавижу 1С
гуру
22.07.08
✎
09:34
|
Нельзя
|
|||
47
Яндекс
22.07.08
✎
09:39
|
(44)покажи где там идет явное преобразование в строку? ... то есть используется функция "строка" ... а не возможность "+" в одинэс
|
|||
48
Stepa86
22.07.08
✎
09:40
|
я думал в той мегатеме суть сабжа раскрыта... (21) и аналоги укладываются в ограничения
|
|||
49
ЛНТ
22.07.08
✎
09:41
|
(47) кто говорит о явных преобразованиях?
по твоей логике в (31) нет цикла, ведь слово "цикл" нигде не встречается |
|||
50
Яндекс
22.07.08
✎
09:41
|
(49)что для тебя цикл?
|
|||
51
Яндекс
22.07.08
✎
09:42
|
еще раз ... в сабже разрешено использовать "+" ... есть какие-либо ограничения на его использования...
а вот ограничения на использования цикла есть |
|||
52
Nordok
22.07.08
✎
09:43
|
переводи в двоичную и определяй сколько влезет
|
|||
53
Яндекс
22.07.08
✎
09:45
|
(52)в 1С ... используя только +,-,/ и * ... перевести в двоичную
|
|||
54
Stepa86
22.07.08
✎
09:46
|
Цыфро = Чиселко - Цел(Чиселко/10)*10;
ЭтоЧетноеЧисло = (Цыфро = 0) ИЛИ (Цыфро = 2) ИЛИ (Цыфро = 4) ИЛИ (Цыфро = 6) ИЛИ (Цыфро = 8); |
|||
55
ЛНТ
22.07.08
✎
09:47
|
(51) сразу бы сказал, что ты конфигураст, я бы с тобой и не спорил
|
|||
56
Господин ПЖ
22.07.08
✎
09:49
|
тупая ветка...
|
|||
57
Яндекс
22.07.08
✎
09:52
|
(55)то есть специалист больше сказать нечего не можешь и начинаешь личными оскорблениями доказывать свою тупость?
|
|||
58
ЛНТ
22.07.08
✎
09:54
|
(57) я тебе уже сказал, что вызывается функция преобразования типов, что противоречит условию
ты этого не понял - твои проблемы |
|||
59
Яндекс
22.07.08
✎
09:56
|
(58)где??????
|
|||
60
ЛНТ
22.07.08
✎
10:00
|
вот здесь: д = "" + с + "" + б;
|
|||
61
Яндекс
22.07.08
✎
10:05
|
и как это противоречит условиям задачи?
"Используя только ограниченное количество операции +, -, *, / и условий" |
|||
62
Яндекс
22.07.08
✎
10:06
|
это стандартная фича 1С ... так как имеет все данные фактически только одним типом... вариант...
|
|||
63
ЛНТ
22.07.08
✎
10:07
|
(61) тем что используется функция, которая не входит в перечисленное число операций
|
|||
64
ЛНТ
22.07.08
✎
10:08
|
(62) маладец
|
|||
65
Яндекс
22.07.08
✎
10:12
|
(64)сама такая... учите мат.часть
|
|||
66
ЛНТ
22.07.08
✎
10:13
|
(65) теперь выполни (16) при а = 1000
|
|||
67
ЛНТ
22.07.08
✎
10:14
|
оказывается это нечетное число!
|
|||
68
Яндекс
22.07.08
✎
10:23
|
получаем:
|
|||
69
ЛНТ
22.07.08
✎
10:25
|
ну в этом случае для тебя слово конфигураст не оскорбление, а профессия
|
|||
70
kosts
22.07.08
✎
10:26
|
(67) Особенность 1С 8 при преобразовании чисел в строку 1000 -> 1 000
|
|||
71
ЛНТ
22.07.08
✎
10:29
|
(70) знаю
|
|||
72
ЛНТ
22.07.08
✎
10:30
|
это особенность региональных настроек, в соответствие с которыми выполняется функция преобразования числа в строку
|
|||
73
ЛНТ
22.07.08
✎
10:30
|
а вто некоторые конфигурасты вызова этой функции в упор не видят
|
|||
74
Яндекс
22.07.08
✎
10:34
|
(73)специалист... читать за явное и неявное преобразование типов... и что такое цикл...
|
|||
75
ЛНТ
22.07.08
✎
10:36
|
(74) ну на этом и сойдемся
|
|||
76
vde69
22.07.08
✎
10:41
|
собствено по условим (0) - невозможно, по сколько любые арифм действия (из САБЖ) можно свести к 2 простым, а ими ну ни как не получишь результат, вот если можно было-бы использовать переодические функции (синусы и т.д.) то легко
|
|||
77
Яндекс
22.07.08
✎
10:52
|
(76)к одному простому... ведь даже вычитание это сложение с минусом
|
|||
78
ЛНТ
22.07.08
✎
10:54
|
(77) да да, мы уже осознали всю мощь твоего интеллекта
|
|||
79
Гений 1С
гуру
22.07.08
✎
10:55
|
(12) Рекурсия - тот же цикл. Не годится. Число итераций зависит от числа.
(16) Строковые преобразования использовать нельзя, чистую арифметику, плиз... Понятно, что строковыми функциями можно все забубенить. Вот интересно, можно ли это сделать арифметикой? Мда, похоже действительно Нельзя, но можно ли доказать математически, что нельзя? |
|||
80
NcSteel
22.07.08
✎
10:58
|
(78) Собака лает , а караван идет
|
|||
81
Said_We
22.07.08
✎
11:01
|
(79) Возведение в степень числа (-1).
|
|||
82
Яндекс
22.07.08
✎
11:02
|
(78)трудно оснозновать то... чего сам не имеешь
|
|||
83
hhhh
22.07.08
✎
11:03
|
(79) можно сделать даже без арифметических операций:
Если а = 0 Тогда Четное = Истина КонецЕсли; Если а = 1 Тогда Четное = Ложь КонецЕсли; Если а = 2 Тогда Четное = Истина КонецЕсли; Если а = 3 Тогда Четное = Ложь КонецЕсли; ... Если а = МаксимальноеЧислоВКомпьютере Тогда Четное = ... КонецЕсли; Количество чисел ограничено разрядностью компьютера, значит и количество операций тоже ограничено. |
|||
84
Said_We
22.07.08
✎
11:09
|
Если Pow(-1, ИспытуемоеЧисло) >= 0 Тогда
Сообщить("Четное"); Иначе Сообщить("Нечетное"); КонецЕсли; |
|||
85
Skom
22.07.08
✎
11:10
|
ветка отняла половину рабочего дня...
аффтар...спасиба.....!!!! |
|||
86
Живой Ископаемый
22.07.08
✎
11:11
|
2(84) Там же в теме перечислены операции, которые можно использовать...
|
|||
87
Skom
22.07.08
✎
11:15
|
(0) вообще без арифметики
бла_бла_бла Сообщить(ЧислоТвое); Если Вопрос("Четное ли число"....) = "Да" Тогда Предупреждение("Число четное"); КонецЕсли; |
|||
88
Гений 1С
гуру
22.07.08
✎
11:20
|
(86) Если тебе охота поржать, то ты поржал, получи пряник. Меня интересует не идиотское ржание, а просто любопытно, можно ли математическими средствами получить информацию о четности числа без округления или нет. В контексте такой постановки вопроса конкатенация и строковая конвертация не уместны!
|
|||
89
Said_We
22.07.08
✎
11:21
|
(86) Возведение в степент это и есть сложение. Комп по своей сути умеет только складывать и более не чего.
Вычетание это сложение с отрицательным числом (частный случий сложения). Умножение это сложение в цикле со сдвигом по количеству разрядов (ну бывают разновидности, когда на несколько разрядов двигают сразу). Деление это часный случий умножения. Вывод все операции делаются сложением. Даже если вы команду деления DIV на микрокоманды разберете, то получите тоже сложение. :-)) |
|||
90
Said_We
22.07.08
✎
11:23
|
(88) Ну если бы можно было число сдвигать вправо и влево, то за несколько команд делается.
Сдвинул вправо влево и сравнил результат. Хотя на асеммблере достаточно проверить последний разряд. Тоже самое можно сделать используя XOR побитовый. |
|||
91
Живой Ископаемый
22.07.08
✎
11:25
|
(89) Вот и давай, перепиши-ка свой код так, чтобы использовать только операцию умножения и не использовать цикла и сивмольных выражений...
|
|||
92
Said_We
22.07.08
✎
11:25
|
Это я все к чему... Четность и не четность не проверяется сложением округлением и т.д. :-)
|
|||
93
Said_We
22.07.08
✎
11:26
|
Этот вопрос из ряда - можно ли написать программу не используя команды MOV. Ответ да можно, но зачем?
|
|||
94
Гений 1С
гуру
22.07.08
✎
12:14
|
(93) Это задача на смекалку. Можно использовать на тестах.
Т.е. нужно доказать - можно ли проверить четность числа с помощью ограниченного инструментария. |
|||
95
Said_We
22.07.08
✎
12:29
|
(94) Какова цель такого рода проверки, если ценности результат не имеет?
|
|||
96
Гений 1С
гуру
22.07.08
✎
14:06
|
(95) Ценность в напряжении мозгов, а заодно в проверки знаний математики
|
|||
97
Иде я
модератор
22.07.08
✎
14:09
|
Так вы решили или нет?
Какой смысл в тесте, если его вся миста неделю решать будет? |
|||
98
Яндекс
22.07.08
✎
14:12
|
(97)используя только простые операции решить оное незя... сдается мне гений делает тест, абы его никто и никогда не прошел...
|
|||
99
VladZ
22.07.08
✎
14:14
|
Если последняя цифра числа окончивается на 0,2,4,6,8 - число четное... Количество условий сводится к пяти.
|
|||
100
Нуф-Нуф
22.07.08
✎
14:14
|
контрольный
|
|||
101
VladZ
22.07.08
✎
14:15
|
+99 Блин... К конфу дня всякую чушь говорю...
Следует читать так "Если последняя цифра числа является..." |
|||
102
Яндекс
22.07.08
✎
14:15
|
(99)как ты будешь последнию цифру получать имея только "+", "-", "*" и "/"?
|
|||
103
Said_We
22.07.08
✎
14:16
|
Подключаешь DLL, которой передаешь число и оно возвращает тебе четное или нечетное :-))
Так даже не используя +,-,*,/ :-)) |
|||
104
VladZ
22.07.08
✎
14:16
|
Еще один способ:
Сдвинуть число вправо. Если переноса не возникло - число четное. :) |
|||
105
Яндекс
22.07.08
✎
14:17
|
(103)использования функци и процедур кроме четырех операций не допустимо... как подключить ВК и передать ей число?
|
|||
106
Said_We
22.07.08
✎
14:23
|
(105) А давайте и их (+, -, *, /) тоже не допускать?
|
|||
107
Stepa86
22.07.08
✎
14:24
|
а какая в 1С точность числа? может прокатит че нить вроде
Функция Цел(пЧисло) Возврат ((пЧисло/1000000000000000) * 1000000000000000); КонецФункции |
|||
108
Said_We
22.07.08
✎
14:25
|
округление можно использовать не явным образом. 1С же тоже имеет ограничение разрядности после запятой... Или то число, которое считаем будет реквизитом формы в котором задано что оно целое :-))
|
|||
109
Яндекс
22.07.08
✎
14:28
|
(107)хм... это что за функции вы написали?
((256.33/1000000000000000) * 1000000000000000) = 256.33 |
|||
110
Said_We
22.07.08
✎
14:29
|
(109) Ноликов добавь
|
|||
111
Said_We
22.07.08
✎
14:30
|
(109) Это вызов функции ОКР() не явным образом.
|
|||
112
Яндекс
22.07.08
✎
14:32
|
(111)и сколько ноликов добавить надо?
|
|||
113
Said_We
22.07.08
✎
14:33
|
Методом тыка. Пока не округляет - значит еще мало.
|
|||
114
Яндекс
22.07.08
✎
14:35
|
((256.33/100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) * 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) = 256.33
((256.33/1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) * 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) = 0 невзлетает |
|||
115
Stepa86
22.07.08
✎
14:36
|
((256.33/Pow(10,5000)) * Pow(10,5000)) = 256.33 - че за умный компилятор???
|
|||
116
hhhh
22.07.08
✎
14:45
|
(114) попробуй двумя командами.
|
|||
117
Stepa86
22.07.08
✎
14:49
|
пЧисло = 256.33;
Множитель = Pow(10, 1000); пЧисло = пЧисло / Множитель; пЧисло = пЧисло * Множитель; Возврат пЧисло; тоже не взлетело |
|||
118
Whatsun
22.07.08
✎
14:57
|
математические функции что ли разрешили использовать?
|
|||
119
FreeFin
22.07.08
✎
15:33
|
Достаточно серая логика: (ибо каксигда гоню)))
Числим=ЧислоЧ*ЧислоЧ; //двузначие убираем Делим=Числим/2; Если (СтрДлина(Сокрлп(Делим))> СтрДлина(Сокрлп(ЧислоЧ))) и (Прав(Сокрлп(Делим),1)<>"0") Тогда Сообщить("Нечетное!"); Иначе Сообщить("Четное"); КонецЕсли; |
|||
120
FreeFin
22.07.08
✎
15:36
|
чипятался
правильно: Числим=ЧислоЧ*ЧислоЧ; Делим=Числим/2; Если (СтрДлина(Сокрлп(Делим))> СтрДлина(Сокрлп(Числим))) и (Прав(Сокрлп(Делим),1)<>"0") Тогда Сообщить("Нечетное!"); Иначе Сообщить("Четное"); КонецЕсли; |
|||
121
Копер
22.07.08
✎
16:16
|
Четность n числа определяют по делению на 2 нацело => наличие/отсутствие дробной части числа n/2.
Тоесть, с заданными условиями, задача сводится к простому: "Как узнать дробную часть числа, не пытаясь узнать дробную часть числа" |
|||
122
Said_We
22.07.08
✎
16:22
|
(114) Чего анекдот про то как станет "А на ... мне это нужно" и это только половина не вспомнился....?
Мало еще мало... :-)) |
|||
123
Гений 1С
гуру
22.07.08
✎
17:28
|
(118)(119) Нельзя использовать функции 1С, строковые и степень, валите лесом.
|
|||
124
bahmet
22.07.08
✎
17:40
|
бугага..неужто до 200 дотянете...надо еще парочку тупых задачь подкинуть,типа
"найдите сумму или разность чисел без операций +,- и не используя логарифмы и тригонометрию", "найдите степень числа используя тока переменные строкового типа"..и тд :) |
|||
125
Гений 1С
гуру
22.07.08
✎
17:46
|
(124) Докажи, что нельзя и успокойся. Пока не можешь доказать - в сад
|
|||
126
Гений 1С
гуру
22.07.08
✎
17:47
|
В детский!
|
|||
127
Медвед1Сник
22.07.08
✎
18:00
|
Ну в принципе есть такой алгоритм. Правда он не по теоретической части а по практический. Ориентирован на компьютерные числа. Предполагается что числа имеют максимальную (конечную) разрядность.
Суть проста. Последовательно вычитать степени двоек пока не исчерпается. Если в остатке останется единица то число нечетное. Если исходить из восмиразрядного числа то получается такая схема: Если Число > 1 Тогда Число = Число - 2 КонецЕсли; Если Число > 1 Тогда Число = Число - 4 КонецЕсли; Если Число > 1 Тогда Число = Число - 8 КонецЕсли; Если Число > 1 Тогда Число = Число - 16 КонецЕсли; Если Число > 1 Тогда Число = Число - 32 КонецЕсли; Если Число > 1 Тогда Число = Число - 64 КонецЕсли; Если Число > 1 Тогда Число = Число - 128 КонецЕсли; Если Число = 1 Тогда Ответ = "Нечетное" Иначе Ответ = "Четное" КонецЕсли; При этом не зависит от величины числа (кроме разрядности максимального представимого числа, но это "зашито" прочно в алгоритм). Для 32-разрядного числа всего то будет 32 проверки. :) Алгоритм можно еще оптимизировать сзедал вложенные условия :). |
|||
128
Медвед1Сник
22.07.08
✎
18:01
|
сзедал = сделав
|
|||
129
Яндекс
22.07.08
✎
18:04
|
(127)без циклов
|
|||
130
Гений 1С
гуру
22.07.08
✎
18:13
|
(127) Ну этот алгоритм слишком большой для 1С, у нее разрядноть офигенно большая.
|
|||
131
Fynjy
22.07.08
✎
18:14
|
(0) Я же дал подсказку ...
Четное*Нечетное - Четное ... Нечетное*Нечетное - Нечетное ... Как пример: 1*5 = 5 2*5 = 10 3*5 = 15 4*5 = 20 ... |
|||
132
Медвед1Сник
22.07.08
✎
18:14
|
(129) У меня нет циклов.
(130) Да, кстати сам недавно узнал что разрядность у 1сных чисел составляет где-то 1024 бита. |
|||
133
Fynjy
22.07.08
✎
18:20
|
Пусть даны целое число a и натуральное число b. Разделить число a на b с остатком — значит найти такие целые числа q и r, что 0 ? r < b и a = bq + r. Такая пара чисел всегда существует и единственна. Число q называют частным, а r — остатком от деления a на b. Остаток от деления числа a на b равен нулю тогда и только тогда, когда a делится на b.
|
|||
134
Фауст
22.07.08
✎
18:20
|
Что интересно, одни из самых больших веток на мисте - это ветки гения, причем эскалация идиотизма в них не имеет никаких границ. Зачем вы все сюда пишите ? (0) Хоть бы ОФФ поставил.
|
|||
135
Fynjy
22.07.08
✎
18:23
|
(134) эскалация бездельничества ... Люди находят себе проблемы ... А задачка - 6,7 класс ...
|
|||
136
Яндекс
22.07.08
✎
18:25
|
(132)блин не много не так понял... а тот алгоритм что ты привел в (127) изначально не правильный...
|
|||
137
Яндекс
22.07.08
✎
18:26
|
(135)ну давай взрослый реши ее...
|
|||
138
Медвед1Сник
22.07.08
✎
18:27
|
(136) Что неправильного в нем?
|
|||
139
Яндекс
22.07.08
✎
18:34
|
(138)как чего? ... ты его хотя бы проверил
Четное - 0 Нечетное - 1 Четное - 2 Нечетное - 3 Четное - 4 Четное - 5 Четное - 6 Нечетное - 7 Четное - 8 Четное - 9 Четное - 10 Четное - 11 Четное - 12 |
|||
140
Медвед1Сник
22.07.08
✎
18:49
|
Да, я не проверял. Вот исправленный алгоритм :
Если Число > 128 Тогда Число = Число - 128 КонецЕсли; Если Число > 64 Тогда Число = Число - 64 КонецЕсли; Если Число > 32 Тогда Число = Число - 32 КонецЕсли; Если Число > 16 Тогда Число = Число - 16 КонецЕсли; Если Число > 8 Тогда Число = Число - 8 КонецЕсли; Если Число > 4 Тогда Число = Число - 4 КонецЕсли; Если Число > 2 Тогда Число = Число - 2 КонецЕсли; Если Число = 1 Тогда Ответ = "Нечетное" Иначе Ответ = "Четное" КонецЕсли; И его исполнение для числа 197: 197, 69, 5, 1, "Нечетное" |
|||
141
Медвед1Сник
22.07.08
✎
18:58
|
Вот оптимизированный алгоритм :)
Функция МучайЧисло(Число) Число = ?(Число>128, Число = Число - 128, ?(Число>64, Число = Число - 64, ?(Число>32, Число = Число - 32, (Число>16, Число = Число - 16, (Число>8, Число = Число - 8, (Число>4, Число = Число - 4, (Число>2, Число = Число - 2, Число))))))); Если Число > 2 Тогда МучайЧисло(Число); Иначе Возврат(число); КонецЕсли; КонецФункции; Применение в основной программе : Если МучайЧисло(число) = 1 Тогда Ответ = "Нечетное" Иначе Ответ = "Четное" КонецЕсли; Думаю Гений1С будет доволен. :)))))) |
|||
142
Медвед1Сник
22.07.08
✎
18:58
|
Правда там есть скрытые циклы в виде рекурсии :)
|
|||
143
Гений 1С
гуру
22.07.08
✎
19:00
|
(142) потому и не годитцо
|
|||
144
Медвед1Сник
22.07.08
✎
19:02
|
(143) Ну никто не мешает развернуть рекурсию/цикл в явном виде. :)
Как в (140) |
|||
145
ado
22.07.08
✎
19:19
|
(131) И в чем глувокий смысл сей подсказки?
|
|||
146
Яндекс
22.07.08
✎
19:20
|
не упреешь для числа = 99999999999999999999999999999999999999999999999999999999999999 разворачивать
|
|||
147
kot_bcc
22.07.08
✎
20:18
|
(137) Подозреваю, что он не сможет.
ЗЫ Уважаемые решатели! Как Вы думаете - чем отличается задача из (0) с учетом условий от задачи, описанной в (133)? И откуда берется стойкость алгоритмов шифрования с открытым ключом? |
|||
148
Asirius
22.07.08
✎
20:19
|
(79) А в (13) практически и есть доказательство.
Пусть мы ухитрильсь описать такую функцию, возвращающую 0 или 1, в зависимости от того, четная она или нет: Функция ПроверкаЧетности(ПроверяемоеЧисло) <Конечное количество итераций +,*,-,/, ПроверкаУсловий> КонецФункции Для начала заметим, что любую проверку условий можно свести к проверке типа Если ВычислимоеВыражение=0 Тогда ... Иначе ... КонецЕсли; или Если ВычислимоеВыражение>0 Тогда ... Иначе ... КонецЕсли; Таким образом, функция ПроверкаЧетности(ПроверяемоеЧисло) определена не только на целых числах, но и на вещественных. Причем непрерывность теряется у этой фукнкции в конечном количестве точек, а в области определения - это кривая конечного порядка. Тогда получается, что уравнение ПроверкаЧетности(X)=0 имеет бесконечное количество решений (все нечетные X), но для кривой конечного порядка это означает тождественное равенство 0. |
|||
149
Гений 1С
гуру
23.07.08
✎
09:46
|
(148) Обломись, речь идет только о проверки четности натуральных чисел, а не вещественных.
|
|||
150
Stepa86
23.07.08
✎
10:08
|
(149) тогда запрещай операции "-" и "/", иначе задача все равно сводится к вещественному полю чисел
|
|||
151
Ненавижу 1С
гуру
23.07.08
✎
10:12
|
Нельзя, точно также нельзя с помощью этих операций узнать, что число целое
|
|||
152
Яндекс
23.07.08
✎
10:15
|
определение четности числа
если целое число делится на два, оно называется чётным деление - деление заменяет неоднократно повторенное вычитание то есть чтобы узнать делится число на 2 или нет нам надо из него неоднакратно вычетать 2 пока результатом будет 1 или 0 ... |
|||
153
Whatsun
23.07.08
✎
11:25
|
давайте учредим приз, тому кто решит данную математическую проблему 21 века
каждый кто здесь хоть что то вякнул скинется по 1wmz тому кто представит работающуюу программу на 1С либо доказательство невозможности понятное всем остальным. |
|||
154
Яндекс
23.07.08
✎
11:30
|
на гения выплату приза повесить
|
|||
155
AAZ
23.07.08
✎
11:36
|
Берем последнюю цифру числа. Если 1,3,5,7,9 - нечетное, иначе четное :)
|
|||
156
Яндекс
23.07.08
✎
11:37
|
(155)скажи как взять?
|
|||
157
Whatsun
23.07.08
✎
11:37
|
(155) 37ым будете
|
|||
158
Whatsun
23.07.08
✎
11:38
|
напоминаю призовой фонд 37wmz
|
|||
159
AAZ
23.07.08
✎
11:39
|
(156), (157) Да, невнимательно всю ветку читал :)
Так-то бы через преобразование в строку... |
|||
160
AAZ
23.07.08
✎
12:09
|
Во, без рекурсии, но со своими функциями:
//Фигня - реквизит формы: число длина 10, точность 0 Функция ВСтепени(степень) а=1; для б=1 По степень Цикл а=а*10; КонецЦикла; возврат а; КонецФункции Процедура УбратьРазряд(Бяка) перем разряд,значение; разряд=10; Пока Бяка-ВСтепени(разряд)<0 Цикл разряд=разряд-1; КонецЦикла; значение=9; Пока Бяка-значение*встепени(разряд)<0 Цикл значение=значение-1; КонецЦикла; Бяка=Бяка-значение*встепени(разряд); КонецПроцедуры Процедура Сформировать() Пока Фигня>10 Цикл УбратьРазряд(Фигня); КонецЦикла; Если (Фигня=1)или(Фигня=3)или(Фигня=5)или(Фигня=7)или(Фигня=9) Тогда Сообщить("Нечетное"); Иначе Сообщить("Четное"); КонецЕсли; КонецПроцедуры |
|||
161
Гений 1С
гуру
23.07.08
✎
12:09
|
(159) преобразование в строку низзя. Я готов закинуть на мобильный 10 рублей тому, кто решит
|
|||
162
kosts
23.07.08
✎
12:22
|
(161) Маловато будет.
Даешь премию 2^64 копеек! |
|||
163
Гений 1С
гуру
23.07.08
✎
12:31
|
(160) Цикл есть, зависит от длины числа!
|
|||
164
Гений 1С
гуру
23.07.08
✎
12:41
|
(152) не тупи, надоел, почитай условие внимательно.
(151) докажи, что нельзя |
|||
165
Яндекс
23.07.08
✎
12:44
|
(164)сам не тупи... еще раз без циклов достоверно узнать целое число или нет нельзя... читай внематочно опеределения четности и деления
|
|||
166
agent-J
23.07.08
✎
12:54
|
Преобразовать в строку, взять крайний символ справа и проверить условием
Если ("0" и число>0) или "2" или "4" или "6" или "8" тогда четное Иначе Не четное :))) или это не по математически?%)))) |
|||
167
agent-J
23.07.08
✎
12:55
|
О! в (155) уже такой вариант был....
|
|||
168
AAZ
23.07.08
✎
12:57
|
(163) Цикл идет под МАКСИМАЛЬНО ВОЗМОЖНУЮ длину числа. Поставил на форме "10" - вот и в цикле 10 :)
|
|||
169
Vovik
23.07.08
✎
12:58
|
(162)А ты че нокию 3210 хотел?
|
|||
170
Гений 1С
гуру
23.07.08
✎
13:28
|
(165) Прочитал внимательно, доказательства не понял, я же разрешаю юзать умножение и деление для проверки, этого что, не достаточно.
(168) Я понял ход твоей мысли, но мне такое решение не нравится. Потому что для любого натурального числа такое решение не канает, т.к. подразумевает ограниченность разрядности. Хочется чего-нибудь элегантного и не итерационного. |
|||
171
Яндекс
23.07.08
✎
13:38
|
да ибо проверка четное не четное грубо говоря осуществляется так
чисЗначение = 23434545645; пока чисЗначение > 1 цикл чисЗначение = чисЗначение - 2; конеццикла; если чисЗначение = 0 тогда сообщить("четное"); иначе сообщить("нечетное"); конецесли; |
|||
172
Skom
23.07.08
✎
13:42
|
(0) аффтар ты ГАД....
я полночи не спал думая на эту тему.... забил потом.... ыыы чувствую что "истина где то рядом" но не до этого пока |
|||
173
КонецЦикла
23.07.08
✎
13:45
|
(0) Прикалываешься или идиот?
Зачем цикл/рекурсия? 128 или 10000128 - что-то меняется в подходе? |
|||
175
hhhh
23.07.08
✎
13:51
|
(170) 1C не работает с числами неограниченной разрядности. Поэтому скорее прав (168).
|
|||
176
Vovik
23.07.08
✎
13:56
|
Я вижу только сравнение разрядности. Т.е. делим на два. Если знаков после запятой добавилось - нечетное иначе четное. А как еще?
|
|||
177
AAZ
23.07.08
✎
13:59
|
(170) Ну вот без ограничения разряда
Процедура УбратьРазряд(Бяка) перем разряд,значение; разряд=1; Пока Бяка-ВСтепени(разряд)>=0 Цикл разряд=разряд+1; КонецЦикла; разряд=разряд-1; значение=9; Пока Бяка-значение*встепени(разряд)<0 Цикл значение=значение-1; КонецЦикла; Бяка=Бяка-значение*встепени(разряд); КонецПроцедуры |
|||
178
Яндекс
23.07.08
✎
13:59
|
(176)это было понятно еще в самом начале... вот только как просечь что после запятой добавлись знаки используя только арифметику("+-/*") и если
|
|||
179
Zmich
23.07.08
✎
14:06
|
Еще один дурацкий способ. Сделал на форме реквизит диалога ВыбЧисло, куда вводим число, которое хотим проверить на четность. Сделал также реквизит диалога ТемпЧисло (тип - Число, Длина = 19, Точность = 0), поставил флаг "Сделать невидимым". Код:
Процедура Сформировать() ТемпЧисло = ВыбЧисло/2; ТемпЧисло = ТемпЧисло*2; Если ВыбЧисло = ТемпЧисло Тогда Сообщить("Четное"); Иначе Сообщить("Нечетное"); КонецЕсли; КонецПроцедуры |
|||
180
vde69
23.07.08
✎
14:10
|
наверно я ГЕНИЙ, правда в функции получения НОД есть цикл, но ведь эта функция паскаля а не 1с ))))
Если GCD(МоеЧисло, 2) = 2 Тогда сообщить(Четное); Иначе сообщить(не Четное); КонецЕсли; (************************************************************************* Функция ищет наибольший общий делитель двух чисел алгоритмом Евклида. *************************************************************************) function GCD(A : Integer; B : Integer):Integer; begin A := AbsInt(A); B := AbsInt(B); if (a=0) or (b=0) then begin Result := a+b; Exit; end; while a<>b do begin if a>b then begin a := a-b; end else begin b := b-a; end; end; Result := b; end; Собствено из этого следует довольно простой вывод, что если кто сможет реализовать САБЖ, то он найдет новый нариант поиска НОД, а это будет круто ))) |
|||
181
Яндекс
23.07.08
✎
14:17
|
(180)в самой 1С есть функция которая определит... но их использовать нельзя... да и циклы тоже
|
|||
182
Serg_1960
23.07.08
✎
14:21
|
Не по теме... просто так... красиво...
Функция НеЧетноеЧисло(Знач Число) Экспорт // Возврат: Истина для нечетного числа, иначе Ложь Если Число>0 Тогда Возврат ?(Число<2, Число, НеЧетноеЧисло(Число-2)); Иначе Возврат ?(Число>-2, -Число, НеЧетноеЧисло(Число+2)); КонецЕсли; КонецФункции PS: Виват Гений 1С! Почитал, - отдохнул душой... Вспомнил как в школе с дочкой уроки готовили: "Не так нельзя: мы интегралы только в 3-м классе будем проходить" О_О |
|||
183
Яндекс
23.07.08
✎
14:27
|
самая красивая и максимально близкое решение у kost в (16)
|
|||
184
Яндекс
23.07.08
✎
14:28
|
функция ЧетНеЧет(чисЗнач)
с = чисЗнач / 2; д = "" + с + ".5"; е = чисЗнач / 2 * 10 + 0.5; ф = "" + е; если ((чисЗнач = 0) или (д = ф)) тогда возврат "Четное"; иначе возврат "Нечетное"; конецесли; конецфункции; |
|||
185
hhhh
23.07.08
✎
14:34
|
(183) все-таки (179) круче. Без преобразования строк.
|
|||
186
Serg_1960
23.07.08
✎
14:37
|
Гений! Разреши строковые преобразования, а то у меня есть красивое решение :о)
Возврат СтрЧислоВхождений(Число/2, ","); |
|||
187
kosts
23.07.08
✎
14:39
|
(186) Победа в номинации самое короткое решение
|
|||
188
Serg_1960
23.07.08
✎
14:41
|
(187) Спасибо!!!
|
|||
189
kosts
23.07.08
✎
14:41
|
(184) при разных настройках разделитель может быть "." или ","
|
|||
190
Яндекс
23.07.08
✎
14:44
|
(185)
для ВыбЧисло = 99999999999999999990 по 99999999999999999999 цикл Сформировать(); конеццикла |
|||
191
Fragster
гуру
23.07.08
✎
14:46
|
(186) а если % разрешить - то еще круче получится... кстати, % - более стандартная операция, чем преобразования число/строка
|
|||
192
Serg_1960
23.07.08
✎
14:54
|
(189) Не нравится (186)? Ты, враг народа, получи:
Возврат СтрЧислоВхождений(Число/2, Сред(0.1,2,1)); |
|||
193
IT Михаил
23.07.08
✎
14:55
|
(0)в школе информатику не преподавал? )))
|
|||
194
Serg_1960
23.07.08
✎
14:58
|
(193) +1 Это еще тот вопрос: или мы его..., или он нас...
|
|||
195
Bww_
23.07.08
✎
15:03
|
186 ужe было в 39
Если Найти(СокрЛП(КонтрЧисло/2),".")>0 Тогда Возврат "Не четное"; А по существу - используя заданные параметры - задача решения не имеет. По любому, нужно знать либо целую часть заданного числа, либо остаток от его деления на два. Операциями "+, -, *, /" этого узнать не возможно, т.к. это не операции разложения числа на составляющие. |
|||
196
hhhh
23.07.08
✎
15:05
|
(190) ответная граната:
ЧетНечет(2) выдает "Нечетное". |
|||
197
airyashov
23.07.08
✎
15:08
|
если деление целочисленное
число-(число/2)*2 |
|||
198
Яндекс
23.07.08
✎
15:10
|
(196)молодец ... я там нолик пропустил )))
|
|||
199
kosts
23.07.08
✎
15:21
|
(198) И правильно говорят: "Работает - не трогай" :-)
|
|||
200
Serg_1960
23.07.08
✎
15:23
|
А пропади оно пропадом! Дай "сломать" что-нибудь
функция ЧетНеЧет(чисЗнач) Возврат ?(чисЗнач=0 Или (""+чисЗнач/2+"0.5")=(""+(чисЗнач/2*10+0.5))), "", "Не") + "Четное"; КонецФункции; |
|||
201
vde69
23.07.08
✎
15:23
|
Попытка
Выполнить("к"+(Значение/2)=1); возврат "Четное"; Исключение возврат "Нечетное"; КонецПопытки |
|||
202
hhhh
23.07.08
✎
15:24
|
(198) теперь не срабатывает из-за (189)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |