Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
1

Найти в матрице единственный элемент противоположного знака по отношению к другим

09.05.2016, 00:22. Показов 1142. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Я вас уже стал слишком часто беспокоить, хорошо, однако, кой-какие недостатки исправляю сам.
Есть программа, которая работает: она ищет один единственный элемент в матрице, который противоположного знака, чем все остальные. Это значит, что если в матрице NxM все элементы положительные, и один единственный отрицательный (нулей нет, они исключены), то ответ будет: Отрицательный. И наоборот.
Но это работает, когда вводимые N и M соответственно небольшие.
Когда я ввожу 100000000000000000 и 100000000000000000 (или даже чуть меньшее число), то пишет:
C
1
Segmentation fault (core dumped)
Однако, я выделил память под Long Long.

Где ошибка?

Вот код:

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
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    long long i, j, eilute, stulpelis, elementas;
    int skaitliukas_teigiamu = 0;
    int skaitliukas_neigiamu = 0;
    
    scanf ("%lld %lld", &eilute, &stulpelis);
 
        long long **array = (long long **) malloc(eilute * sizeof(long long *));
        for(i = 0; i < eilute; i++) {
            array[i] = (long long *) malloc(stulpelis * sizeof(long long));
        }
 
    for(i = 0; i < eilute; i++) {
        for(j = 0; j < stulpelis; j++) {
            scanf("%lld", &elementas);
                if (elementas > 0) {
                    skaitliukas_teigiamu++;
                }
                if (elementas < 0) {
                    skaitliukas_neigiamu++;
                }
        }
    }
 
    if (skaitliukas_teigiamu > skaitliukas_neigiamu) {
        printf("Neigiamas\n");
    }
 
    if (skaitliukas_neigiamu > skaitliukas_teigiamu) {
        printf("Teigiamas\n");
    }
// free(array);
return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2016, 00:22
Ответы с готовыми решениями:

Определить, единственный ли в матрице максимальный элемент
Определить, единственный ли в массиве(двумерном) максимальный элемент. Определить наибольшее...

За единственный проход по массиву найти неповторяющийся элемент
здравствуйте, уважаемые программисты.) у меня такой вопросик: дан массив из нечетного кол-ва...

Pure Basic: производительность по отношению к другим языкам
Хотел бы узнать какой basic по шустрее да и вообще сравнение с другими языками, может у кого то...

Что определяет цену каждой валюты по отношению к другим валютам?
Что определяет цену каждой валюты по отношению к другим валютам? Может, спрос на эту валюту...

17
Эксперт .NET
10571 / 6495 / 1506
Регистрация: 25.05.2015
Сообщений: 19,671
Записей в блоге: 14
09.05.2016, 08:49 2
Это размеры двухмерного массива?
В настоящее время на этой планете нет компьютеров с таким объёмом памяти.
А чтобы ввести все элементы вручную, Вам не хватит времени до конца Вселенной.
0
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
09.05.2016, 11:43  [ТС] 3
Попытаюсь еще раз написать требования к программе.
Условие: в заданном прямоугольном массиве все элементы или только положительные, или только отрицательные, кроме одного элемента, у которого противоположный знак чем у других элементов. Написать программу, которая установила бы этот знак. Вывод программы: Положительный или Отрицательный.

Условие: размер массива N, M и Aij. (1 < N, M < 10 в степени 18; -10 в степени 6 < Aij < 10 в степени 6).

Так как? )) Или это у нас препод немного космический? ))
0
Эксперт .NET
10571 / 6495 / 1506
Регистрация: 25.05.2015
Сообщений: 19,671
Записей в блоге: 14
09.05.2016, 11:47 4
Если надо именно реализовать с такими границами, то скорее всего это опечатка.
Алгоритм не изменится всё равно.
Можно сделать виртуальный массив, но врядли задание это предусматривает, и длительность поиска также будет нереальная.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,653
Записей в блоге: 13
09.05.2016, 11:51 5
В условии задачи явная ошибка. Кстати, long long здесь не нужен, нужен float (если числа от 10-6 до 106
0
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
09.05.2016, 12:17  [ТС] 6
Спасибо за советы, а почему float а не int? Целые числа берем ведь....
0
Эксперт .NET
10571 / 6495 / 1506
Регистрация: 25.05.2015
Сообщений: 19,671
Записей в блоге: 14
09.05.2016, 12:28 7
Aliksan, там ни слова про целые числа в Aij.
0
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
09.05.2016, 14:30  [ТС] 8
Я не добавил, что числа целые, да, все понятно. Спасибо!

Добавлено через 15 минут
Запустил программу в системе контестер. И на последнем тесте выдает ошибку: Time limit.
То бишь программа работает почти аккуратно, но где здесь подвох? Сравнение числа происходит в том же цикле, что и считывание с клавиатуры. Что бы это могло быть?

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
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int i, j, eilute, stulpelis, elementas;
    int skaitliukas_teigiamu = 0;
    int skaitliukas_neigiamu = 0;
    
    scanf ("%d %d", &eilute, &stulpelis);
 
        int **array = (int **) malloc(eilute * sizeof(int *));
        for(i = 0; i < eilute; i++) {
            array[i] = (int *) malloc(stulpelis * sizeof(int));
        }
 
    for(i = 0; i < eilute; i++) {
        for(j = 0; j < stulpelis; j++) {
            scanf("%d", &elementas);
                if (elementas > 0) {
                    skaitliukas_teigiamu++;
                }
                if (elementas < 0) {
                    skaitliukas_neigiamu++;
                }
        }
    }
 
    if (skaitliukas_teigiamu > skaitliukas_neigiamu) {
        printf("Neigiamas\n");
    }
 
    if (skaitliukas_neigiamu > skaitliukas_teigiamu) {
        printf("Teigiamas\n");
    }
free(array);
return 0;
}
Добавлено через 1 час 18 минут
Пришел ответ преподавателя.
В 7 тесте дана таблица 1000х1000, однако, прошу обратить ваше внимание, что программе уделено всего 0,075 секунд, поэтому самый простой код здесь не уместится во временные рамки. Необходимо придумать оптимально работающий код. Вот как...

Добавлено через 7 минут
Тут надо поднять новую тему...
0
Эксперт .NET
10571 / 6495 / 1506
Регистрация: 25.05.2015
Сообщений: 19,671
Записей в блоге: 14
09.05.2016, 14:55 9
Можно представить двумерный массив как одномерный.
a[row][column] == a[row * column_width + column].
Т.е. для перебора всех элементов достаточно увеличивать указатель на размер 1 элемента.
Хотя с динамическими массивами с отдельным созданием подмассивов это не прокатит.
1
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
09.05.2016, 15:33  [ТС] 10
Цитата Сообщение от Rius Посмотреть сообщение
a[row][column] == a[row * column_width + column].
Я это уже где-то видел! Вы не могли бы встроить его вот в этот цикл?...
C
1
2
3
4
        int **array = (int **) malloc(eilute * sizeof(int *));
        for(i = 0; i < eilute; i++) {
            array[i] = (int *) malloc(stulpelis * sizeof(int));
        }
0
Эксперт .NET
10571 / 6495 / 1506
Регистрация: 25.05.2015
Сообщений: 19,671
Записей в блоге: 14
09.05.2016, 16:35 11
В этот - нет.
Создайте массив не в 1 + N проходов, а за 1 раз. Сразу размером M * N, одномерный.
1
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
09.05.2016, 17:42  [ТС] 12
Цитата Сообщение от Rius Посмотреть сообщение
Сразу размером M * N, одномерный
Переделал программу, но теперь во время запуска кидает вот это:
C
1
Segmentation fault (core dumped)
Сам код програмы.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int i, j, eilute, stulpelis, elementas;
    int *ptr;
    int skaitliukas_teigiamu = 0;
    int skaitliukas_neigiamu = 0;
    
    scanf ("%d %d", &eilute, &stulpelis);
 
//      int **array = (int **) malloc(eilute * sizeof(int *));
//      for(i = 0; i < eilute; i++) {
//          array[i] = (int *) malloc(stulpelis * sizeof(int));
//      }
 
    if ((*ptr = (int*) malloc(eilute*stulpelis *sizeof(int)) == NULL)) {
        return 0;
    } else {
        for(i = 0; i < eilute*stulpelis; i++) {
            *(ptr + i) = i;
        }
            for(i = 0; i < eilute; i++) {
                for(j = 0; j < stulpelis; j++) {
                scanf("%d", &elementas);
                    if (elementas > 0) {
                        skaitliukas_teigiamu++;
                    }
                    if (elementas < 0) {
                        skaitliukas_neigiamu++;
                    }
                }
            }
    }
 
 
    if (skaitliukas_teigiamu > skaitliukas_neigiamu) {
        printf("Neigiamas\n");
    }
 
    if (skaitliukas_neigiamu > skaitliukas_teigiamu) {
        printf("Teigiamas\n");
    }
//free(array);
return 0;
}
Всех поздравляю с праздником!
0
Эксперт .NET
10571 / 6495 / 1506
Регистрация: 25.05.2015
Сообщений: 19,671
Записей в блоге: 14
09.05.2016, 17:51 13
C++
1
if ((ptr = (int*)malloc(eilute*stulpelis *sizeof(int))) == NULL) {
Скобки не там и звездочка лишняя.
Пользуйтесь пошаговым отладчиком.
1
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
09.05.2016, 19:10  [ТС] 14
Цитата Сообщение от Rius Посмотреть сообщение
Скобки не там и звездочка лишняя.
Пользуйтесь пошаговым отладчиком.
Заработало!!! Урра!

Пишу код, может кому пригодится!

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int i, j, eilute, stulpelis, elementas;
    int *ptr;
    int skaitliukas_teigiamu = 0;
    int skaitliukas_neigiamu = 0;
    
    scanf ("%d %d", &eilute, &stulpelis);
 
    if ((ptr = (int*) malloc(eilute*stulpelis *sizeof(int))) == NULL) {
        return 0;
    } else {
        for(i = 0; i < eilute*stulpelis; i++) {
            *(ptr + i) = i;
        }
            for(i = 0; i < eilute; i++) {
                for(j = 0; j < stulpelis; j++) {
                scanf("%d", &elementas);
                    if (elementas > 0) {
                        skaitliukas_teigiamu++;
                    }
                    if (elementas < 0) {
                        skaitliukas_neigiamu++;
                    }
                }
            }
    }
 
    if (skaitliukas_teigiamu > skaitliukas_neigiamu) {
        printf("Otricatelnoe\n");
    }
 
    if (skaitliukas_neigiamu > skaitliukas_teigiamu) {
        printf("Polozitelnoe\n");
    }
//free(array);
return 0;
}
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,653
Записей в блоге: 13
09.05.2016, 19:40 15
Лучший ответ Сообщение было отмечено Rius как решение

Решение

Если условие задачи формулируется так: все элементы, кроме одного имеют один и тот же знак, и ровно один имеет противоположный знак, и нужно найти этот противоположный знак (напечатать "положительный" или "отрицательный"), то просматривать весь массив не нужно. Достаточно взять три любых элемента - и все! Возможные случаи:
- все три > 0 -> ответ отрицательный
- все три < 0 -> ответ положительный
- два > 0, один меньше - ответ отрицательный
- два < 0, один больше - ответ положительный

Работать это будет очень быстро.
2
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
09.05.2016, 19:58  [ТС] 16
Цитата Сообщение от Catstail Посмотреть сообщение
Работать это будет очень быстро.
Я думал об этом, но мысль куда-то затерялась... Так получается, что моя программа может посчитать все положительные и все отрицательные значения. )
Спасибо, за замечание, админ!
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,653
Записей в блоге: 13
09.05.2016, 20:01 17
Цитата Сообщение от Aliksan Посмотреть сообщение
Так получается, что моя программа может посчитать все положительные и все отрицательные значения
- да, но по условию этого не нужно.
0
Эксперт .NET
10571 / 6495 / 1506
Регистрация: 25.05.2015
Сообщений: 19,671
Записей в блоге: 14
09.05.2016, 20:04 18
Точно, оказывается координаты самого элемента не нужны по заданию
Поэтому числа такие большие, чтобы намекать на ненужность полного просмотра.
0
09.05.2016, 20:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2016, 20:04
Помогаю со студенческими работами здесь

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

Найти в матрице максимальный элемент и его номера в матрице
Дана матрица из 2 строк и 3 столбцов.Найти в матрице максимальный элемент и его номера в матрице!

Найти самый наименьший элемент в матрице, и найти сумму столбца который стоит этот наименьший найденный элемент
Найти самый наименьший элемент в матрице, и найти сумму столбца который стоит этот наименьший...

Найти наибольший элемент в квадратной матрице, удалить из нее строку, содержащую этот элемент
Дана квадратная матрица А(6, 6) найти наибольший по модулю элемент. Получить матрицу B(5, 6) путем...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru