C/C++

Помогите пожалуйста с C++.

Заполнить массив 3 на 3 числовыми значениями.
Определить, является ли он магическим квадратом, т. е. таким, в котором суммы во всех строках и столбцах одинаковы.
#include <iostream>
#include <iomanip>
using namespace std;
class Square {
public:
static const auto overflow = numeric_limits<long long>::max();
Square(const size_t n, const int x = 0) : n(n), sq(new int* [n]) {
for (auto i = 0U; i < n; ++i) {
sq[i] = new int[n];
for (auto j = 0U; j < n; ++j) sq[i][j] = x;
}
}
~Square() {
if (sq != nullptr) {
for (auto i = 0U; i < n; ++i) delete[] sq[i];
delete[] sq;
sq = nullptr;
}
}
long long sumrow(const size_t index)const {
auto sum = 0LL;
if (index < n) {
for (auto i = 0U; i < n; ++i) sum += sq[index][i];
return sum;
}
return overflow;
}
long long sumcolumn(const size_t index)const {
auto sum = 0LL;
if (index < n) {
for (auto i = 0U; i < n; ++i) sum += sq[i][index];
return sum;
}
return overflow;
}
bool ismagic()const {
auto tmp = sumrow(0U);
for (auto i = 1U; i < n; ++i) {
auto sum = sumrow(i);
if (sum != tmp) return false;
}
for (auto i = 0U; i < n; ++i) {
auto sum = sumcolumn(i);
if (sum != tmp) return false;
}
return true;
}
private:
size_t n;
int** sq;
friend istream& operator>>(istream& inp, Square& s) {
for (auto i = 0U; i < s.n; ++i) {
for (auto j = 0U; j < s.n; ++j) {
inp >> s.sq[i][j];
}
}
return inp;
}
};
int main() {
puts("Input square 3x3: ");
Square sq(3);
cin >> sq;
puts(sq.ismagic() ? "Yes" : "No");
system("pause > nul");
}
Игорь Чернухо
Игорь Чернухо
97 863
Лучший ответ
подобных задач в гугле полно
Laziz Adizov
Laziz Adizov
73 465
А мне вот о чём подумалось: нельзя ли заполнять матрицу случайными значениями из диапазона, скажем, [1; 9] ? И пусть тогда программа сама выбирает из них магические квадраты. Тогда вот сама программа:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
int n;
bool yes(int a[][3])
{
int i, j, s = 0, S = 0;
for (i = 0; i < 3; i++) S += a[i][i];
for (i = 0; i < 3; i++) s += a[i][2 - i];
if (s != S) return 0;
for (i = 0; i < 3; i++)
{
s = 0;
for (j = 0; j < 3; j++) s += a[i][j];
if (s != S) return 0;
}
for (j = 0; j < 3; j++)
{
s = 0;
for (i = 0; i < 3; i++) s+= a[i][j];
if (s != S) return 0;
}
return 1;
}
void print(int a[][3])
{
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
cout << setw(3) << a[i][j];
cout << endl;
}
cout << endl;
}
int main()
{
int a[3][3], i, j, t = time(NULL);
srand(t);
while (time(NULL) - t < 30)
{
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
a[i][j] = rand() % 9 + 1;
if (yes(a)) print(a);
}
}
А вот что получается:
Mahmud Kuchkarov Маша, у Вас вычисляются настоящие магические квадраты с одинаковыми суммами по строкам, столбцам, а также по главной и побочной диагоналям, а последнее условие в соответствии с заданием не является обязательным. И я не поленился запустить Вашу программу, только числа брал из диапазона [1;20], поэтому их так мало и выдало (см. фото внизу!). Но главное то, что из какой-то ерунды вы умудрились сделать что-то интересное - фабрику курьёзов!
Mahmud Kuchkarov ☝️ А если взять диапазон ещё более расширенным (типа [1..99]), то в таком случае на получение результатов можно надеяться лишь только как на чудо!..