Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 33
1

Предложить тесты, на которых программа даст сбой

13.08.2019, 11:25. Показов 1882. Ответов 15
Метки нет (Все метки)

Доброго вам времени суток, уважаемые форумчане. Недавно я наткнулся на - с виду - несложную задачку. Вот условие:

Уравнение
(Время: 1 сек. Память: 16 Мб Сложность: 17%)
Вася в школе изучил квадратные уравнения и понял, как они легко решаются путем вычисления дискриминанта. Но Петя поведал ему о методе решения кубических уравнений вида A*X3 + B*X2 + C*X + D = 0. На факультативе по математике Васе задали решить около ста уравнений как раз такого вида. Но, к сожалению, Вася забыл формулы, о которых рассказывал ему Петя. Но Васе было известно, что все корни уравнений – целые числа и находятся на отрезке [-100, 100]. Поэтому у Васи есть шанс найти их методом перебора, но для этого ему придется затратить уйму времени, т.к. возможно необходимо будет осуществить перебор нескольких тысяч значений. Помогите Васе написать программу, которая поможет ему найти корни кубических уравнений!

Входные данные
В единственной строке входного файла INPUT.TXT записаны 4 числа: A, B, C и D – целые коэффициенты кубического уравнения. Каждый коэффициент по модулю меньше 32768, A ≠ 0.

Выходные данные
В единственную строку выходного файла OUTPUT.TXT нужно вывести через пробел в порядке возрастания все корни заданного кубического уравнения. Кратные корни следует выводить только один раз.
ПРИМЕР:
Input: 1 -3 0 0
Output:0 3


Я решил не заморачиваться и решил ее перебором (Код следующий.
C++
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
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
 
int main(){
    setlocale(LC_ALL, "Rus");
    ifstream read("./input.txt");
    int a,b,c,d, j = 0;
    read >> a >> b >> c >> d;
    read.close();
    ofstream write("./output.txt"); 
    for (int i = -101; i <= 101; i++)
    {
        if (a*i*i*i + b*i*i + c*i + d == 0)
            {
                if (j == 0)
                    write << i; //A*X3 + B*X2 + C*X + D = 0
                else
                    write << " " << i;
                j++;
            }
    }
    write.close();
}
Вроде как все должно быть радужно, да? Ага, конечно. На последнем тесте она выдала ошибку.
А теперь суть проблемы: я понятия не имею, что там, в тестах, находится и почему программа выдает ошибку.
Лично я перепробовал все варианты, у меня закончилась фантазии и теперь я прошу вас помочь.
Предлагайте варианты, которые подходят под условие, но программа на них крашнется.

Добавлено через 43 секунды
Там должен быть не а : ).
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2019, 11:25
Ответы с готовыми решениями:

Генерация N случайных натуральных чисел в диапазоне [A;B], среднее арифметическое которых даст M
Собственно, сабж. M может быть как целым, так и вещественным. Волнует именно вопрос о том, как...

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

Программа должна предложить все возможные варианты распределения учеников по классам.
Всем привет! Записался на курсы по Java. Прошли if - esle и switch. Вот задача: Есть 5 классов с х...

Программа тесты
Здравствуйте всем! Обращаюсь с просьбой: помогите выяснить ошибку в коде. unit...

15
6500 / 4422 / 2531
Регистрация: 18.12.2017
Сообщений: 13,827
13.08.2019, 11:33 2
возможно всё просто - ответы должны быть на отрезке [-100, 100], а не на отрезке [-101, 101]
1
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 33
13.08.2019, 11:46  [ТС] 3
Это я немного изменил диапазон, пытаясь решить проблему сам. Изначально там было от 100 до 100 и программа точно также крашилась. Но идея логичная, спасибо.
0
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
13.08.2019, 12:24 4
Цитата Сообщение от Useringo Посмотреть сообщение
Вроде как все должно быть радужно, да? Ага, конечно. На последнем тесте она выдала ошибку.
А где ты отслеживаешь кратные корни, которые нужно вывести только один раз?
1
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 33
13.08.2019, 12:27  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А где ты отслеживаешь кратные корни, которые нужно вывести только один раз?
Кратные корни - равные корни. При таком решении ни один корень не будет выведен более одного раза (Цикл просто пойдет дальше). Хотя, может я и ошибаюсь...
0
6500 / 4422 / 2531
Регистрация: 18.12.2017
Сообщений: 13,827
13.08.2019, 13:37 6
Лучший ответ Сообщение было отмечено Useringo как решение

Решение

Useringo, в строке 9 замените тип int на тип long long
1
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 33
13.08.2019, 13:48  [ТС] 7
Цитата Сообщение от Yetty Посмотреть сообщение
Useringo, в строке 9 замените тип int на тип long long
Yetty, уже пробовал. Это было первым, что я сделал. Потом я изменил диапазон [-100..100] на [-201..201]. Потом проверял, нет ли одинаковых корней.

PS: Я даже создавал отдельную переменную long long, равную
C++
1
a*i*i*i + b*i*i + c*i + d
. Я думаю, что в тесте либо какой-то очень хитрый подвох, либо я проглядел неточность в программе.
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
13.08.2019, 13:55 8
А что будет если все a,b,c,d=0 ? Какой ответ должен ожидаться?
1
6500 / 4422 / 2531
Регистрация: 18.12.2017
Сообщений: 13,827
13.08.2019, 13:58 9
Лучший ответ Сообщение было отмечено Useringo как решение

Решение

какой текст сообщения об ошибке ?

вот с интернета код, проверьте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <fstream>
using namespace std;
int main() {
  ifstream ifst("input.txt");
  ofstream ofst("output.txt");
  
  long long a, b, c, d;
  ifst >> a >> b >> c >> d;
  
  for (int x = -100; x <= 100; ++x) {
    if (x*x*x*a + x*x*b + c*x + d == 0)
      ofst << x << " ";
  }
}
Цитата Сообщение от Крашеная Посмотреть сообщение
А что будет если все a,b,c,d=0 ?
Крашеная, по условию
Цитата Сообщение от Useringo Посмотреть сообщение
A ≠ 0.
1
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
13.08.2019, 14:27 10
Цитата Сообщение от Useringo Посмотреть сообщение
Yetty, уже пробовал. Это было первым, что я сделал. Потом я изменил диапазон [-100..100] на [-201..201]. Потом проверял, нет ли одинаковых корней.
PS: Я даже создавал отдельную переменную long long, равную
С int при a,b,c,d == 32767, будет переполнение
1
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
13.08.2019, 14:47 11
Скорее всего не имеет ничего общего с ошибкой но...
Почему мне хочется записать в таком виде? Я не права?
C++
1
2
if ( d + x*(x*(x*a + b) + c)== 0 )
...
2
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,053
13.08.2019, 15:15 12
Цитата Сообщение от Крашеная Посмотреть сообщение
Почему мне хочется записать в таком виде?
Потому что любишь группировать, собирать, прибирать, порядок.
Мне хочется так записать
C++
1
2
if (!(d + x*(x*(x*a + b) + c)))
//...
Или
C++
1
2
3
4
for (int x = -100; x <= 100; ++x)
{
      ofst << (d + x * (x * (x * a + b) + c) ? "" : std::to_string(x) + " ");
}
2
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
13.08.2019, 16:27 13
Про
C++
1
return 0
не забыл ?

проверка на существование файла или пустой файл
1
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 33
13.08.2019, 17:52  [ТС] 14
Цитата Сообщение от Andrey B Посмотреть сообщение
Про
C++Выделить код
1
return 0
не забыл ?
Такой ошибки быть не может, система всегда дает файл input и открывает файл output.
PS: проверка автоматическая.

Добавлено через 39 секунд
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
С int при a,b,c,d == 32767, будет переполнение
И какой же тогда брать тип данных?

Добавлено через 2 минуты
Цитата Сообщение от Yetty Посмотреть сообщение
вот с интернета код, проверьте:
Спасибо, заработало. Сейчас буду закрывать тему.
PS: а чем этот код отличается от моего?

Добавлено через 1 минуту
PPS: подскажите, как закрыть тему.

Добавлено через 3 минуты
Цитата Сообщение от Yetty Посмотреть сообщение
вот с интернета код, проверьте:
Я понял, в чем была ошибка. Я заменил в своем коде int на long, как мне уже советовали, и все заработало.
PPS: но в int же влезает до -2 147 483 648 / 2 147 483 647, нет?
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
13.08.2019, 18:00 15
Цитата Сообщение от Useringo Посмотреть сообщение
но в int же влезает до -2 147 483 648 / 2 147 483 647, нет?
если а = 32767, то 100*100*100*32767 = 32 767 000 000 это больше чем 2 147 483 647 ...
0
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 33
13.08.2019, 19:25  [ТС] 16
Цитата Сообщение от Крашеная Посмотреть сообщение
если а = 32767, то 100*100*100*32767 = 32 767 000 000 это больше чем 2 147 483 647 ...
Спасибо, понял ошибку. Не подскажите, как тему закрыть?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2019, 19:25

Программа не проходит тесты
Здравствуйте, решаю задачу: Имеется список людей с указанием их фамилии, имени и даты рождения....

Программа проверяющая тесты
Здравствуйте, обращаюсь к вам за помощью так как уже нет выхода):wall Надо написать программу...

Программа с процедурами не проходит тесты
Добрый день Пишу сюда, так как не могу найти ошибку самостоятельно. Код программы с...

Программа не проходит определённые тесты
Вот такой вот вышел код для данной задачи но он почему-то не проходит выше второй группы хотя если...

Программа не проходит некоторые тесты
Доброго времени суток, друзья! Решаю задачу: вывод стандартный вывод Дана строка, состоящая...

Программа должна предложить ввести строку и подстроку, и вывести все вхождения подстроки в строку
Прошла лекция на данную тему, я прослушав понял - что я ничего не понял :) Вообщем дали такое...


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

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

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