powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Четность\нечетность
25 сообщений из 61, страница 2 из 3
Четность\нечетность
    #36389998
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneAntonariyПреобразование неявное.

Jah loves you.

это битовая операция, но никак не преобразование.Тогда я не понял при чем тут преобразование вообще.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36390001
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да не причём =)
просто фраза была у шокер.про про преобразование двоичное

PS
хороший топик получился
...
Рейтинг: 0 / 0
Четность\нечетность
    #36390002
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТогда я не понял при чем тут преобразование вообще.

Ну я имел ввиду функцию Bin$, которая преобразовывает число в строку с двоичным представлением. Но ее нет в VB, к сожалению (как и Oct$, Hex$...). Зато у тебя в итоге самый крутой вариант получился
...
Рейтинг: 0 / 0
Четность\нечетность
    #36390019
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, в смысле как вариант индусского кода?

Jah loves you.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36390036
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тут в фоне тестю в Excel и в wsh:

Check = Value Mod 2 = 0 - both
Check = (Input \ 2 = Input / 2) - both
IsOdd - only Excel
Check1 = Not Value And 1 - only Excel

Индусский код не проверял, но думаю - both :)
...
Рейтинг: 0 / 0
Четность\нечетность
    #36390071
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Если кто в ассемблере кумекает, можно вставки сделать.
Как делать вставки смотреть тут .
По идее всего-то надо проверить 0-вой бит.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36390076
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА, в смысле как вариант индусского кода?

Ну да.
Наверное, еще можно как-то через логарифм решить
...
Рейтинг: 0 / 0
Четность\нечетность
    #36390077
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, имя из предыдущего сообщения забыл убрать.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391068
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В условии спрашивалось про число , но уважаемые неиндусы ;-) почему-то решили ограничиться диапазонами чисел Integer и Long, позабыв про Double.
А так как операторы Mod , \ , And работают только с числами в диапазоне не более Long, т.е. от -2147483648 до 2147483647, то единственно корректное решение для чисел в VB как раз то, что якобы " вообще за гранью добра и зл а", которое привёл Igor Mitichev . Все остальные варианты сглючат. В этом легко убедиться на числах, например, 2147483650# (чётное) и 2147483651# (нечётное).

Также корректно, но медленно сработают WorksheetFunction.IsOdd и WorksheetFunction.IsEven, которые упомянул _Boroda_ , но это применимо не к VB (см.запрос), а только к VBA Excel, причём, начиная с версии 2007.

Функции определения чётности/нечетности удобнее записать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Function IsEven(Num As Double) As Boolean
  IsEven = Fix(Num /  2 ) = Num /  2 
End Function

Function IsOdd(Num As Double) As Boolean
  IsOdd = Fix(Num /  2 ) <> Num /  2 
End Function
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391070
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если нужно сделать полный аналог Excel-функций =ISEVEN() и =ISODD() из надстройки Analysis ToolPack, которые игнорируют дробную часть числа, тогда так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Function IsEvenXL(Num As Double) As Boolean
  IsEvenXL = Fix(Num) /  2  = Fix(Fix(Num) /  2 )
End Function

Function IsOddXL(Num As Double) As Boolean
  IsOddXL = Fix(Num) /  2  <> Fix(Fix(Num) /  2 )
End Function
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391317
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI,

Давайте-ка заглянем в Википедию

Чётность в теории чисел — способность целого числа делиться без остатка на 2.

То есть в вашем случае число не удовлетворяет сразу двум условиям определения - оно не целое и не делится без остатка на 2 (в любом случае)

Я не знаю, откуда засунули в Вики это определение, но вы его оспариваете?
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391455
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе ничто не запрещает double иметь целое значение, но я ни разу не встречал задачу, где было бы необходимо проверить на четность именно double. Как правило при использовании double разработчика интересует именно его способность иметь дробную часть. Так что рассуждения ZVI к реальности отношения не имеют. В конце концов Clng(dbl) никто не отменял и оно в любом случае быстрее Fix (тем более в количестве трех штук) с обвесами.

Jah loves you.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391603
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну моей у моей функции тоже нет ограничений связанных с Integer.
Просто меняем тип входящей переменной на String.
По идее можно вообще любое целое число проверять если его загнать в String.

Sub test()
MsgBox isOdd(2147483654#)
End Sub

Function isOdd(number As String) As Boolean
Select Case Right(number, 1)
Case 0, 2, 4, 6, 8
isOdd = True 'Чётное
Case Else
isOdd = False 'Нечётное
End Select
End Function
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391660
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djon Player,

Ваша функция нерабочая технически (число всегда будет нечетное) и неадекватная логически (попробуйте проверить число 0.2, когда исправите предыдущую ошибку).
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391748
Igor Mitichev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВариант с Fix вообще за гранью добра и зла.

Почему? Здесь рассматривались варианты с "\" и "mod". Но чем принципиальным они отличаются? MSDN собственно, раскрывает работу mod через fix. По сути то же самое относится и к "\". Другой вопрос, как оно там внутри реализовано... Может fix и будет работать чуть медленнее, но как это определить?

MSDNВыражение a Mod b является эквивалентом для любой из следующих формул:
a - (b * (a \ b))
a - (b * Fix(a / b))


То есть получается, что если мы используем mod, то VB для вычисления результата где-то там внутри себя все равно использует fix (или "\", но сдается мне, что она тоже в конце концов обратится к fix). Или я чего-то недопонимаю?
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391834
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor MitichevПочему?Потому что во-первых Fix, во-вторых If, в-третьих целых три арифметических операции. Результат немного предсказуем.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Private Sub Form_Load()
Dim r As Boolean
d = Timer
For x =  1  To  100000000 
    r = Check( 2222 )
Next
Debug.Print Timer - d
d = Timer
For x =  1  To  100000000 
    r = Check1( 2222 )
Next
Debug.Print Timer - d
d = Timer
For x =  1  To  100000000 
    r = chek( 2222 )
Next
Debug.Print Timer - d
End Sub


Public Function Check(ByVal Value As Integer) As Boolean
    Check = (Value \  2  = Value /  2 )
End Function

Public Function Check1(ByVal Value As Integer) As Boolean
    Check1 = Value Mod  2  =  0 
End Function

Private Function chek(number As Integer) As Boolean
   If (number /  2  - Fix(number /  2 )) Then
    chek = False
   Else
    chek = True
   End If
End Function

  14 , 60938  
  12 , 90625  
  15 , 8125  

Другой вопрос, как оно там внутри реализовано... Не столь важно, как это там реализовано, важнее то, что VB имеет тормоза при передаче параметров. А If медленнее Select case.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Dim Value As Integer
d = Timer
Value =  2222 
For x =  1  To  100000000 
    r = Value Mod  2  =  0 
Next
Debug.Print Timer - d

  2 , 078125  
Показательно, не так ли? C ByVal будет еще раза в два медленне, чем 15,8125, но уже по той причине, что будет выделяться память под локальную переменную и копирование значения.


Jah loves you.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391880
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyDjon Player,

Ваша функция нерабочая технически (число всегда будет нечетное) и неадекватная логически (попробуйте проверить число 0.2, когда исправите предыдущую ошибку).На счёт нерабочая, не согласен. И чётность и нечётность показывает верно. А пример с 0.2 не корректен, т.к. 0.2. не является целым числом и проверять его чётность бессмысленно. Оно не является ни тем не другим.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391918
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет ByVal беру свои слова назад, это видимо справедливо для строк (не помню уже, где я наблюдал резкий прирост производительности при переходе на ByRef), получилась прямо противоположная картина. А вернее каша.
Результаты с ByRef:

Check_Div 15,03125
Check_Mod 13,26563
Check_Fix 15,78125
Check_And 12,67188

Результаты с ByVal:

Check_Div 14,5625
Check_Mod 12,98438
Check_Fix 15,42188
Check_And 13,64063

Обратите внимание, первые три способа от перехода на ByVal выиграли, а последний проиграл целую секунду! Я произвел несколько замеров, это результат последнего, картина везде одинаковая, так что сучайные флуктуации винды можно исключить.

Jah loves you.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391932
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djon PlayerAntonariyDjon Player,

Ваша функция нерабочая технически (число всегда будет нечетное) и неадекватная логически (попробуйте проверить число 0.2, когда исправите предыдущую ошибку).На счёт нерабочая, не согласен. И чётность и нечётность показывает верно. А пример с 0.2 не корректен, т.к. 0.2. не является целым числом и проверять его чётность бессмысленно. Оно не является ни тем не другим.На счет нерабочей да, я забыл, что строка приведется к числу, поэтому 2 = "2". А насчет логичности — вы же ее позиционируете как работающую со строками, а где гарантия, что в строке не будет, например, отрывок из Капитала? В случае с числовыми типами это гарантируется самим типом. Так что вашей функции не хватает проверки на валидность.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391943
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чтобы совсем закрыть этот вопрос, вот ее результат:
isOdd 93,0625

Оставим ее индусам.

Jah loves you.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391947
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
На счет нерабочей да, я забыл, что строка приведется к числу, поэтому 2 = "2". А насчет логичности — вы же ее позиционируете как работающую со строками, а где гарантия, что в строке не будет, например, отрывок из Капитала? В случае с числовыми типами это гарантируется самим типом. Так что вашей функции не хватает проверки на валидность.
В предыдущих примерах при использовании тех-же 0.2 результат будет так-же не верен (либо выдадут, что число чётно, либо что нечётно, а это в любом случае не правильно), но почему-то там про проверку валидности вы не упомянули.
А валидность проверить не сложно.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391960
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА чтобы совсем закрыть этот вопрос, вот ее результат:
isOdd 93,0625

Оставим ее индусам.

Jah loves you. Что медленно работает, согласен, но это и так было ожидаемо.
У меня получились такие реузьтаты:
Check 9,71875
Check1 7,890625
chek 10,75
isOdd 81,53125
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391971
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djon PlayerВ предыдущих примерах при использовании тех-же 0.2 результат будет так-же не веренВ предыдущих примерах дробное число проверить вообще не получится потому что тип целочисленный, число будет округлено.
Djon PlayerА валидность проверить не сложно.Угу, и затормозить тем самым до черепашьего состояния. Нет уж, велосипеды нам не нужны, а с квадратными колесами тем более :)


Jah loves you.
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391976
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djon PlayerУ меня получились такие реузьтаты:Попробую угадать: Intel Core i5? :)
...
Рейтинг: 0 / 0
Четность\нечетность
    #36391985
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyDjon PlayerУ меня получились такие реузьтаты:Попробую угадать: Intel Core i5? :)Почти, но чуть похуже Intel Core 2 DUO E7400 2800Mhz
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Четность\нечетность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]