Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Сегодня, я был очень удивлён. Потому, у меня такой вопрос. Представьте что вам нужно написать простейшую функцию кратного факториала. Она ниже, но без указания типов данных. Пусть, T_i либо unsigned, либо int. Вообще говоря, входные параметры всегда больше нуля. И выход также всегда больше нуля. Подскажите пожалуйста, как бы вы расставили типы данных в коде ниже ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 03:38 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 09:46 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
хотя это некорректно, т.к. нужно обработать случаи n=k и n<k. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 09:56 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
На всякий случай привожу ссылку (для мемберов). https://ru.wikipedia.org/wiki/Факториал#.D0.9A.D1.80.D0.B0.D1.82.D0.BD.D1.8B.D0.B9_.D1.84.D0.B0.D0.BA.D1.82.D0.BE.D1.80.D0.B8.D0.B0.D0.BB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:01 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
Учитывай что у данных типов переполнение никак не обрабатывается, а при вычислении факториалов можно легко выйти за 2^32. Поэтому лучше знаковый int и проверку что res > 0. Код: plaintext 1. 2. 3. 4. 5. 6. По возможности надо проверять что значения не уходят за допустимые параметры. Иначе получишь 100% гарантию в какой-то момент получить неверный результат и не будешь знать что он неверный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:10 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
mayton, т.е. результат не определён для n, не кратного k? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:10 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
RWolf , спасибо. Но ваш алгоритм не верен. Например, в классическом случае, при кратности 1, 3!=0, согласно вашему предложению. Однако, дело не в этом. Я тоже поставил unsigned везде, и вероятно для всех вас очевидно, но я так и не понял почему этот код уходит в бесконечный цикл, если на входе например 10,3 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. А вот такой код, например, работать будет Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Я думаю, что дело в выражении Код: plaintext 1. но я сохранял остаток от деления в отдельную переменную типа int, и результат был прежним. А сейчас снова проверил, и всё нормально заработало. Т.е. скорее всего проблема с типами данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:20 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
Ух ты, я пока писал ответ, тут ещё столько сообщений появилось C: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:21 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, да, неверно — я не сделал проверку на ноль: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:23 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
Дмитрий, в моём случае 1<=n<=10, потому по поводу переполнения я не волновался. Нужно было сразу про это написать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:23 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
SashaMercury Я тоже поставил unsigned везде, и вероятно для всех вас очевидно, но я так и не понял почему этот код уходит в бесконечный цикл, если на входе например 10,3 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Не везде поставил. Похоже срабатывает неявное приведение типов. SashaMercuryв моём случае 1<=n<=10, потому по поводу переполнения я не волновался. тогда бери int, с ним удобнее и компилятор не будет ворнинги писать про сравнения знаковых и беззнаковых и т.п. кстати цикл проще так написать Код: plaintext 1. думаю так оба варианта заработают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:36 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
Я бы посоветовал везде где возможно использовать int, т.к. он более универсальный. unsigned int в исключительных случаях, например для хранения флагов, или когда изначально задано что значение в диапазоне 0 - 2^32-1, например CRC32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:53 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryя так и не понял почему этот код уходит в бесконечный цикл, если на входе например 10,3 При сравнении знакового и беззнакового оба операнда рассматриваются как беззнаковые. Когда i станет отрицательным, условие выхода не сработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 10:59 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
Ребята. Факториал это очень быстро растущая функция. Факториал 13 уже превышает сетку int32. Здесь как раз нужна арифметика символьных вычислений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 12:23 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
SashaMercury Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 13:31 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
Ребята, вы не поверите ! Сейчас шел по темным улицам из магазина, и 1. понял в чём ошибка, 2. В чём была бы ошибка, если бы я был прав изначально 3. Появился ещё один вопрос Только переоденусь и напишу, с расстановкой весёлые комментарии :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 15:35 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
А нет. Я не ошибся. Думал что логическая ошибка, но всё нормально. Пока шел вспомнил то, про что написал RWolf, глава 2 K&R, если в выражении присутствует unsigned, то всё приводится к этому типу. Вроде бы так. Вероятно по этому и происходит. Дмитрий, ваш вариант лучше того что я написал. Но с unsigned почему-то не срабатывает. Почему сейчас то не срабатывает? А видимо по этой же причине. Появляется битовая единица в старшем разряде(когда уходим в минус), но так unsigned читается как 2^31,а не как -1. Вообще совет с int вероятно буду использовать. Не "вероятно", а буду. mayton, вы правы, длинная арифметика в общем случае нужна, но в данном случае нет, я тестировал кое-что.. Вот казалось бы, столько читаю,программирую, а всё-равно детские ошибки. И ведь вспомнил про приведение к unsigned, правда вечером, но сам вспомнил. Но почему сразу не понял этого ((( Должен был сразу увидеть это( Всем спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 16:19 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
Саша я вот щас шёл по коридорам офиса, зашёл в кофе-автомат и вот думал что ты наверное всё уже знаешь по С/C++ а вопросы задаёшь просто так по приколу. Может твоя фамилия Луговский и ты решил нас всех круто развести. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 16:20 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
ахаха, нет конечно, я точно не он ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 16:31 |
|
||
|
Кратный факториал. Некоторые моменты.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВот казалось бы, столько читаю,программирую, а всё-равно детские ошибки. Это нормально. Лично я "детские" ошибки перестал делать лет через десять после начала работы программистом. Тут главное понять почему наступил на грабли и принять меры чтобы это не повторить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 20:57 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2019333]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
98ms |
get topic data: |
10ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 325ms |
| total: | 528ms |

| 0 / 0 |
