C/C++

Помощь с задачей на Си (C)

Проверить, имеется ли в одномерном числовом массиве A из n элементов, хотя бы одна пара взаимно обратных чисел. Решение я реализовал, но работает оно неверно. Уже долго пытаюсь выяснить что не так. Помощь нужна именно в обьяснении что не так в моей реализации через вложенный цикл. #include
#include
#include
#include
#include

int main()
{
setlocale(LC_ALL, "Rus");
double arr[100], number;
int count = 0, n, i = 0;

printf("Введите число n ");
scanf_s("%d", &n);

for (int i = 0; i < n; i++)
{
scanf_s("%lf", &number);
arr[i] = number;
}

for (int i = 0; i < n; i++) {
for (int j = 1; j < n; j++) {
if ((double)(1 / (arr[i])) == (double)arr[j]) {
count += 1;
break;
}
}
}

if (count == 0) {
printf("Пара взаимно обратных чисел не найдена");

}
else if (count == 1){
printf("Пара взаимно обратных чисел найдена");
}

return 0;
}
NB
Nurdibek Badbas
118
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define BUFFER 100
int main(void) {
double box[BUFFER];
int n;
int i, j;
_Bool find = false;
system("chcp 1251 > nul");
do {
printf("Введите размер массива: ");
scanf_s("%i", &n);
} while (n < 1 || n > BUFFER);
printf("Введите элементы массива: \n");
for (i = 0; i < n; ++i) {
scanf_s("%lf", &box[i]);
}
for (i = 0; i < n; ++i) {
for (j = i + 1; j < n; ++j) {
if (box[i] > 0) {
if (box[i] == 1 / box[j]) {
find = true;
break;
}
} else if (box[j] > 0) {
if (box[j] == 1 / box[i]) {
find = true;
break;
}
}
}
}
puts(find ? "Найдены!" : "Не найдены!");
system("pause > nul");
return 0;
}

P.S. Может, найдёте для себя что-то новое.
Дмитрий Прондяев
Дмитрий Прондяев
73 077
Лучший ответ
Nurdibek Badbas Спасибо за помощь! Всего хорошего :)
1) брейк выйдет только из внутреннего цикла, внешний продолжит выполняться, count может стать больше 1. Проще обойтись без переменной count, во внутреннем цикле как только пара нашлась, делать вывод и return 0. А после цикла, если туда добрались, вывод, что не найдены.

2) Числа с плавающей точкой всегда следует считать приблизительными, то есть математически числа слева и справа от знака сравнения равны, но в компьютере они на капелюшку могут отличаться. Поэтому пишем так:
в начале double epsilon = 0.0000000001; // количество ноликов от балды поставил
и потом if ( fabs(a[i] * a[j] - 1 ) <= epsilon { выводим что нашли пару; return 0; }

3) ну и цикл по j надо начинать не с 1, а с i+1
Heiden Price
Heiden Price
9 861
Nurdibek Badbas Спасибо за помощь! Всего хорошего :)