Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
#1

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

23.07.2011, 18:11. Просмотров 2106. Ответов 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-битного числа со знаком (делимое не нуль) ?"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2011, 18:11     Делить на ноль нельзя?
Посмотрите здесь:

C++ че то я ноль (С++)
Как делить? C++
C++ Builder Умножить, делить.. - не работает!
Задача 94. В заданном целочисленном массиве опре¬делить количество перемен знаков C++
C++ Задача: делить числа на отдельные цифры
Как делить деньги? C++
Гражданин 1 марта открыл счет в банке, вложив 1000 руб. Через каждый месяц размер вклада увеличивается на 2% от имеющейся суммы. Опре-делить: а) прир C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 18:53     Делить на ноль нельзя? #2
Если вопрос про 32-битное число, почему используешь long long?
Или я чего-то не понял?

Добавлено через 3 минуты
Ой, понял. Есть ещё одна такая пара чисел, что переполнение происходит.) Хорошая задача. Плюсик тебе.)
iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:01  [ТС]     Делить на ноль нельзя? #3
Deviaphan, а есть мысли насчет оставшегося теста?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 19:09     Делить на ноль нельзя? #4
Какого теста?
Ответ на вопрос прост: a = INT_MIN, b = -1
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
23.07.2011, 19:09     Делить на ноль нельзя? #5
MSVS 2010, собака, для результата a/b автоматически делает _int64, если принудительно задать int, то ответ неправильный (делимое выводит) ))
iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:21  [ТС]     Делить на ноль нельзя? #6
Deviaphan, у меня вроде все правильно вышло, прилагаю. Или я где-то жестко туплю?
Миниатюры
Делить на ноль нельзя?  
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
23.07.2011, 19:26     Делить на ноль нельзя? #7
iama, дело в том, что ответ должен быть положительное число, а INT_MAX= |INT_MIN|-1, т.е. в int невлазиет. Если ты выполняешь программу в таком виде, как в первом посте, то читай мой пост выше.
iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:29  [ТС]     Делить на ноль нельзя? #8

Это надо мне так тупить огромное спасибо, я бы долго еще медитировал
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 19:34     Делить на ноль нельзя? #9
А ещё лучше читай мой первый пост. long long это синоним _int64, т.е. компилятору даже ничего преобразовывать не надо, ты сам ему 64 битные числа указал.
Но и в твоём варианте такая же пара чисел существует, просто а немного меньше.)
iama
1249 / 974 / 48
Регистрация: 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;
 }
Зашло в полный балл
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 19:51     Делить на ноль нельзя? #11
Только ты для INT64_MIN / -1 ситуацию не обработал.)
iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
23.07.2011, 19:57  [ТС]     Делить на ноль нельзя? #12
Цитата Сообщение от Deviaphan Посмотреть сообщение
Только ты для INT64_MIN / -1 ситуацию не обработал.)
По условию, входные данные - 32-битные числа, так что в этой задаче это не нужно
ValeryS
Модератор
6483 / 4949 / 455
Регистрация: 14.02.2011
Сообщений: 16,395
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 ; //переход если выставлен флаг переполнения
}
не проверял просто мысли вслух
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.07.2011, 20:37     Делить на ноль нельзя? #14
Цитата Сообщение от ValeryS Посмотреть сообщение
деление на 0 можно обработать исключением
Можно. SEH.
ValeryS
Модератор
6483 / 4949 / 455
Регистрация: 14.02.2011
Сообщений: 16,395
23.07.2011, 20:51     Делить на ноль нельзя? #15
Цитата Сообщение от Kastaneda Посмотреть сообщение
ответ неправильный (делимое выводит)
ответ и не может быть правильным
INT_MIN=0х80000000 не имеет положительного аналога
0х80000000=-2147483648
а 2147483648( не существует) тоже будет 0х80000000
максимальное число 2147483647=0x7FFFFFFF
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
23.07.2011, 20:54     Делить на ноль нельзя? #16
ValeryS, мы это уже выяснили)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2011, 21:01     Делить на ноль нельзя?
Еще ссылки по теме:

Введенное число делить на второе введенное число пока первое число не станет равным нулю C++
Сколько раз необходимо число 5000 делить пополам C++
C++ дана действительная матрица размера m*n делить числа b1,.,bm равные соответственно произведение элементов ст
C++ Перевод десятичного вещественного числа в двоичное путем побитовых операций (Делить на 2 нельзя)
Предложения делить на слова C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6483 / 4949 / 455
Регистрация: 14.02.2011
Сообщений: 16,395
23.07.2011, 21:01     Делить на ноль нельзя? #17
Ну и слава богу
просто решил повторить что не для всех отрицательных есть модуль
Yandex
Объявления
23.07.2011, 21:01     Делить на ноль нельзя?
Ответ Создать тему
Опции темы

Текущее время: 05:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru