Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
1

Делить на ноль нельзя?

23.07.2011, 18:11. Просмотров 3209. Ответов 16
Метки нет (Все метки)

Я в курсе, нельзя. Но это было бы полбеды. Проблема в том, что судя по всему, нельзя делить не только на ноль. Есть интересная задача и неинтересное
решение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main()
 {
    long long a, b;
 
    cin >> a >> b;
  
    if (b == 0)
        cout << "ERROR";
    else
        cout << a / b;
 
    cout << endl;
 
    return 0;
 }


И, понятно, оно не проходит в одном тесте. В чем же таки подвох? Сам вопрос, наверное, должен звучать так: "При каких двух 32-битных числах со знаком частное от деления невозможно представить в формате 32-битного числа со знаком (делимое не нуль) ?"
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2011, 18:11
Ответы с готовыми решениями:

Почему нельзя делить с остатком float/double
Доброго времени суток, объясните мне, почему нельзя делить с остатком числа с точкой? К примеру...

Перевод десятичного вещественного числа в двоичное путем побитовых операций (Делить на 2 нельзя)
Нужно написать код на С++, который переводит вещественное десятичное число в двоичное с помощью...

Не работает проверка на ошибку "делить на нуль нельзя!";
Я хочу сделать проверку на то чтобы при делении на нуль выскакивала ошибка под определенным...

Почему нельзя делить элементы матрицы в подпрограмме на элементы матрицы? 60-я строка
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #include &lt;cmath&gt; using namespace std;...

16
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 18:53 2
Если вопрос про 32-битное число, почему используешь long long?
Или я чего-то не понял?

Добавлено через 3 минуты
Ой, понял. Есть ещё одна такая пара чисел, что переполнение происходит.) Хорошая задача. Плюсик тебе.)
1
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:01  [ТС] 3
Deviaphan, а есть мысли насчет оставшегося теста?
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 19:09 4
Какого теста?
Ответ на вопрос прост: a = INT_MIN, b = -1
2
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
23.07.2011, 19:09 5
MSVS 2010, собака, для результата a/b автоматически делает _int64, если принудительно задать int, то ответ неправильный (делимое выводит) ))
1
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:21  [ТС] 6
Deviaphan, у меня вроде все правильно вышло, прилагаю. Или я где-то жестко туплю?
0
Миниатюры
Делить на ноль нельзя?  
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
23.07.2011, 19:26 7
iama, дело в том, что ответ должен быть положительное число, а INT_MAX= |INT_MIN|-1, т.е. в int невлазиет. Если ты выполняешь программу в таком виде, как в первом посте, то читай мой пост выше.
2
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:29  [ТС] 8

Это надо мне так тупить огромное спасибо, я бы долго еще медитировал
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 19:34 9
А ещё лучше читай мой первый пост. long long это синоним _int64, т.е. компилятору даже ничего преобразовывать не надо, ты сам ему 64 битные числа указал.
Но и в твоём варианте такая же пара чисел существует, просто а немного меньше.)
1
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:47  [ТС] 10
Цитата Сообщение от Deviaphan Посмотреть сообщение
А ещё лучше читай мой первый пост. long long это синоним _int64, т.е. компилятору даже ничего преобразовывать не надо, ты сам ему 64 битные числа указал.
Но и в твоём варианте такая же пара чисел существует, просто а немного меньше.)
Я ж и подозревал, что как-то переполнение может образоваться, просто не мог понять, как именно, деление ж все таки по мне - для этой конретной задачи легче грубый костыль сделать, так вот решил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main()
 {
    long long a, b;
 
    cin >> a >> b;
  
    if (b == 0 || a / b == 2147483648)
        cout << "ERROR";
    else
        cout << a / b;
 
    cout << endl;
 
    return 0;
 }
Зашло в полный балл
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 19:51 11
Только ты для INT64_MIN / -1 ситуацию не обработал.)
0
1334 / 985 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:57  [ТС] 12
Цитата Сообщение от Deviaphan Посмотреть сообщение
Только ты для INT64_MIN / -1 ситуацию не обработал.)
По условию, входные данные - 32-битные числа, так что в этой задаче это не нужно
0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,181
23.07.2011, 20:06 13
деление на 0 можно обработать исключением
а переполнение разрядной сетки в ассемблере обрабатывается на раз
может и на С как нибудь так
C
1
2
3
4
5
6
asm{
mov eax,a;
mov ebx,b;
div eax,ebx;
jc error ; //переход если выставлен флаг переполнения
}
не проверял просто мысли вслух
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 20:37 14
Цитата Сообщение от ValeryS Посмотреть сообщение
деление на 0 можно обработать исключением
Можно. SEH.
0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,181
23.07.2011, 20:51 15
Цитата Сообщение от Kastaneda Посмотреть сообщение
ответ неправильный (делимое выводит)
ответ и не может быть правильным
INT_MIN=0х80000000 не имеет положительного аналога
0х80000000=-2147483648
а 2147483648( не существует) тоже будет 0х80000000
максимальное число 2147483647=0x7FFFFFFF
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
23.07.2011, 20:54 16
ValeryS, мы это уже выяснили)
0
Модератор
Эксперт по электронике
8231 / 6098 / 814
Регистрация: 14.02.2011
Сообщений: 21,181
23.07.2011, 21:01 17
Ну и слава богу
просто решил повторить что не для всех отрицательных есть модуль
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2011, 21:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нужно сделать чтобы при делении на ноль, выводило На ноль делить нельзя, введите другое число
Я сделал, на ноль то он не делит, но когда ввожу другие значение, то там тоже выводится Делить на...

Почему нельзя делить на ноль?
Не знаю, в какой раздел писать, пишу сюда. Приветствую всех. В школьные годы учительница...

Почему нельзя делить на ноль, а умножать можно?
CW8DT3ufo-U Почему нельзя делить на ноль а умножать можно? По возможности, прошу аргументировать...

При сравнении выдаёт ошибку, что нельзя делить на ноль
Сегодня попал на странную вещь, есть такой код(number = 546) for(int x = 1; number / x &gt;= 0;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.