Проверить, имеется ли в одномерном числовом массиве 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;
}
C/C++
Помощь с задачей на Си (C)
#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. Может, найдёте для себя что-то новое.
#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. Может, найдёте для себя что-то новое.
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
2) Числа с плавающей точкой всегда следует считать приблизительными, то есть математически числа слева и справа от знака сравнения равны, но в компьютере они на капелюшку могут отличаться. Поэтому пишем так:
в начале double epsilon = 0.0000000001; // количество ноликов от балды поставил
и потом if ( fabs(a[i] * a[j] - 1 ) <= epsilon { выводим что нашли пару; return 0; }
3) ну и цикл по j надо начинать не с 1, а с i+1
Nurdibek Badbas
Спасибо за помощь! Всего хорошего :)
Похожие вопросы
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- Программирование, нужна помощь в решение задачи! На си или си++
- Задача по программированию C++
- Нужна помощь с задачей по c++
- Нужна помощь с выполнением заданий в C++
- Помогите решить задачу пожалуйста, в C++
- Помогите пожалуйста решить задачу на Си
- В чём логика Си/C++?
- Нужна помощь с задачей на С++
- Мне нужна помощь с одной задачкой по c++.