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

Узнай цену своей работы

Формулировка задачи:

Добрый вечер. Я вас уже стал слишком часто беспокоить, хорошо, однако, кой-какие недостатки исправляю сам. Есть программа, которая работает: она ищет один единственный элемент в матрице, который противоположного знака, чем все остальные. Это значит, что если в матрице NxM все элементы положительные, и один единственный отрицательный (нулей нет, они исключены), то ответ будет: Отрицательный. И наоборот. Но это работает, когда вводимые N и M соответственно небольшие. Когда я ввожу 100000000000000000 и 100000000000000000 (или даже чуть меньшее число), то пишет:
Segmentation fault (core dumped)
Однако, я выделил память под Long Long. Где ошибка? Вот код:
#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;
}

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

textual
Листинг программы
#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;
}

Объяснение кода листинга программы

  1. Объявление переменных:
    • i, j - для циклов;
    • eilute, stulpelis - для матрицы;
    • elementas - для поиска элемента;
    • ptr - указатель на матрицу;
    • skaitliukas_teigiamu, skaitliukas_neigiamu - для подсчета элементов с положительным и отрицательным знаком соответственно.
  2. Запрос на ввод размеров матрицы.
  3. Выделение памяти под матрицу.
  4. Заполнение матрицы числами от 0 до eilute*stulpelis-1.
  5. Перебор элементов матрицы и подсчет количества положительных и отрицательных чисел.
  6. Сравнение количества положительных и отрицательных чисел и вывод соответствующего сообщения.
  7. Освобождение памяти.
  8. Возврат 0, т.к. это основная функция программы и она не должна возвращать значение.

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы