Найти в матрице единственный элемент противоположного знака по отношению к другим - C (СИ)
Формулировка задачи:
Добрый вечер.
Я вас уже стал слишком часто беспокоить, хорошо, однако, кой-какие недостатки исправляю сам.
Есть программа, которая работает: она ищет один единственный элемент в матрице, который противоположного знака, чем все остальные. Это значит, что если в матрице NxM все элементы положительные, и один единственный отрицательный (нулей нет, они исключены), то ответ будет: Отрицательный. И наоборот.
Но это работает, когда вводимые N и M соответственно небольшие.
Когда я ввожу 100000000000000000 и 100000000000000000 (или даже чуть меньшее число), то пишет:
Однако, я выделил память под Long Long.
Где ошибка?
Вот код:
Segmentation fault (core dumped)
#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;
}
Объяснение кода листинга программы
- Объявление переменных:
- i, j - для циклов;
- eilute, stulpelis - для матрицы;
- elementas - для поиска элемента;
- ptr - указатель на матрицу;
- skaitliukas_teigiamu, skaitliukas_neigiamu - для подсчета элементов с положительным и отрицательным знаком соответственно.
- Запрос на ввод размеров матрицы.
- Выделение памяти под матрицу.
- Заполнение матрицы числами от 0 до eilute*stulpelis-1.
- Перебор элементов матрицы и подсчет количества положительных и отрицательных чисел.
- Сравнение количества положительных и отрицательных чисел и вывод соответствующего сообщения.
- Освобождение памяти.
- Возврат 0, т.к. это основная функция программы и она не должна возвращать значение.