C/C++

Салют Амигос) Откуда в рабочем коде выскакивает несуществующие число. Сделайте ревью по фасту. Много сил не отнимет))

Failed test #2 of 3. Wrong answer

This is a sample test from the problem statement!

Test input:
4 6 7 9 12 14 18 21 26 28 10
Correct output:
no

Your code output:
3

ПЕРВЫЙ ТЕСТ ПРОХОДИТ.
Test input:
-5 -1 2 5 7 10 14 15 20 22 10
Test output:
5
ВТОРОЙ И ТРЕТИЙ НЕТ.
ВОТ СОБСТВЕННО КОД.
#include "iostream"
#include "cstdlib"
using namespace std;
int main(int argc, char* argv[]) {
setlocale(LC_ALL,"rus");
const int N = 10; int a[N];
// погнали))))
for(auto &i : a) cin >> i; //цикл для ввода
int elem; // элемент для ввода юзером
cin >> elem;//
//бинарный поиск
int low = 0, up = N - 1, middle_; // иницилизация границ и середины
int found_middle;// создаю несуществующий индекс, чтобы перезаписать потом в него новое значение
do{
middle_ = (low+up) / 2; // нахожу средний элемент
if(found_middle = (a[middle_] == elem)){ // сравниваю условием
found_middle = middle_;// перезаписываю в индекс значение
break;} //выхожу из цикла
if(elem < a[middle_]) { // иду справа налево
up = middle_ - 1;}
else
if (elem > a[middle_]) {// слева направо
low = middle_ + 1;}
}while(low<=up);// до тех пор, пока нижняя граница меньше или равна верхней
if (found_middle == -1){ cout <<"no\n";} //проверка на изменения индекса
else {cout << middle_;}
return 0;}
вы присваиваете found_middle значение сравнения a[middle_] == elem, то есть или 0 или 1, как по вашему этот if хоть раз не сработает?)
if(found_middle = (a[middle_] == elem)){ // сравниваю условием
found_middle = middle_;// перезаписываю в индекс значение
break;} //выхожу из цикла
И как у вас может вообще наступить условие:
if (found_middle == -1){ cout <<"no\n";} //проверка на изменения индекса
Если вы -1 ни разу в него не присваиваете? и в цикле нет возможности его появления. написано очень криво.
Дархан Абилов
Дархан Абилов
5 910
Лучший ответ
Николай Сергеев Так в чём подвох и что присваивать?) То что в этом блоке кода я лоханулся это и так понятно)) Мне как преподаватель показал так я и делаю)
Дархан Абилов если бы вы просто вбили в поиск просто Бинарный поиск в массиве, то вам там столько бы вариантов выдали, в том числе этот, например: https://codelessons.ru/cplusplus/algoritmy/binarnyj-poisk-po-massivu-c.html
Но вы же крутой самоучка, нафига пользоваться поиском, пусть вам объясняют то, что миллионы раз до вас озвучено и решено, людям же делать явно нечего, да?.
~RE:
do{
middle_ = (low+up) / 2; // нахожу средний элемент
if(found_middle = (a[middle_] == elem)){ // сравниваю условием
found_middle = middle_;// перезаписываю в индекс значение
break;} //выхожу из цикла
if(elem < a[middle_]) { // иду справа налево
up = middle_ - 1;}
else
if (elem > a[middle_]) {// слева направо
low = middle_ + 1;}
}while(low<=up);// до тех пор, пока нижняя граница меньше или равна верхней
if (found_middle == -1){ cout <<"no\n";} //проверка на изменения индекса
else {cout << middle_;}
return 0;}

◉ После исправления:

do{
middle_ = (low+up) / 2; // нахожу средний элемент
if(a[middle_] == elem){ // сравниваю условием
cout << middle_;
return 0;}
if(elem < a[middle_]) { // иду справа налево
up = middle_ - 1;}
else {// слева направо
low = middle_ + 1;}
}while(low<=up);// до тех пор, пока нижняя граница меньше или равна верхней
cout <<"no";
return 0;}
GK
Gosha Kalashnikov
16 172
Gosha Kalashnikov Флаг нужно удалить — он больше не используется!!!
Gosha Kalashnikov КАК ТОЛЬКО ИСКОМЫЙ ЭЛЕМЕНТ ОБНАРУЖЕН, ВЫВОДИМ ЕГО ИНДЕКС И ПРЕРЫВАЕМ ИСПОЛНЕНИЕ ПРОГРАММЫ ПО return 0;

ЦИКЛ БОЛЬШЕ НЕ ВЫПОЛНИТСЯ!!!