• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Двумерные Массивы И Структуры

  • Автор темы dkgC
  • Дата начала
D

dkgC

Язык выполнения - СИ. Задание таково, что нужно определить пару матриц с наибольшим кол-вом простых чисел отличных друг от друга на 2 (типа : 5 7). Я так понял, что числа должны быть расположены как-то так [0][0] [0][1]. [0][1] [0][2] (это я привел пример с индексами) и т.д.
Все, до чего я допер, это вот этот код, ввод кол-ва структур, имен матриц и размерностей их, ну и заполнение естесно.
Как я понял, алгоритм выполнения следующий:
1. Проходим по каждой матрице циклом и ищем есть ли там вообще простые числа (типа как-то matr[j]%2==1) и если есть flag=1. Если нету - break и выход из программы.
2. Проходим по каждой матрице циклом и находим разность между разность между элементами. Хотя вот тут опять придется эти эл-ты проверять на простое/непростое. Ну и вроде если она равна 2 - то ставим на счетчик k++.
3. Выводим название пар матриц с наиб. вот такими числами отличающихся на два.

Как это реализовать - понимаю не очень :lol:
Прошу помощи, камрады!
C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


typedef struct table {
char *name;
int **matr;
} Tables;

int main()
{
int T, N, M;
int i, j, h;
Tables *table;
printf("Enter the T (number of structures):");
scanf("%d", &T); 
table = (Tables *)malloc(T * sizeof(Tables));
printf ("\nEnter the N (the size of the matrix):");
scanf("%d", &N);
for (int k = 0; k < T; k++) {
printf ("\nEnter the name of the %d-th matrix - ", k+1);
table[k].name=(char *)malloc(10 * sizeof(char));
scanf("%s", table[k].name);
printf ("\nEnter the elements of the matrix %s \n",table[k].name);
table[k].matr=(int **)malloc(N*sizeof(int *));
for (int i = 0; i < N; i++) { 
table[k].matr[i]=(int *)malloc(N * sizeof(int));
for (int j = 0; j < N; j++) { 
printf ("%s[%d][%d]= ", table[k].name, i, j);
scanf ("%d", &table[k].matr[i][j]);
}	
}
}
getch();
}
 
D

dkgC

бред и в описании задания
и в описании алгоритма
Два простых числа называются «близнецами», если они отличаются друг от друга на
2(например, числа 5 и 7). Определить пару матриц с наибольшим количеством
«близнецов». вот пруф
 
R

rrrFer

напиши функцию поиска простого числа в заданным значением в матрице и все будет тривиально.

МОжет не совсем правильно, но когда ты найдешь число 7 - то будешь искать в матрице числа 5 и 9, число 9 ты не найдешь в любом случае, т.к. функция ищет простое число(сначала проверяет на простоту, потом ищет).



Правильно это делать я думаю так:
выбираешь в std::set из матрицы все числа (повторяющиеся числа при этом отсеятся автоматически, а также, числа автоматически будут упорядочены.

Обходишь set и сравниваешь разницу каждого числа со следующим (если -2 - увеличиваешь счетчик)
 
D

dkgC

напиши функцию поиска простого числа в заданным значением в матрице и все будет тривиально.

МОжет не совсем правильно, но когда ты найдешь число 7 - то будешь искать в матрице числа 5 и 9, число 9 ты не найдешь в любом случае, т.к. функция ищет простое число(сначала проверяет на простоту, потом ищет).



Правильно это делать я думаю так:
выбираешь в std::set из матрицы все числа (повторяющиеся числа при этом отсеятся автоматически, а также, числа автоматически будут упорядочены.

Обходишь set и сравниваешь разницу каждого числа со следующим (если -2 - увеличиваешь счетчик)
Таки да, спасибо, но сложность в том, что моих знаний для этого не достаточно :lol:
 
R

rrrFer

Код:
bool f(int val, int **a, int n, int m) {
for (int i = sqrt(val); i > 1; --i) if (0 == val % i) return false;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (a[i][j] == val) return true;
return false;
}

Добавлено: или второй варьянт:
Код:
bool isEasy(int val) {
for (int i = sqrt(val); i > 1; --i) 
if (0 == val % i) 
return false;
return true;
}

Код:
//..
std::set<int> set_;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if(isEasy(a[i][j])
set_.insert(a[i][j]);
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!