Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 19.04.2010, 10:41   #1 (permalink)
фзк
Новичок
 
Регистрация: 19.04.2010
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Товарищи, друзья, приятели, помогите кто может! Срочно надо решить задачу в паскале!

Торищи,друзья ,приятели , помогите кто может ! Срочно надо решить задачу в паскале !

магическим квадратом порядка n называется квадратная матрица размера n*n составленная из чисел 1,2,...,n2 (в квадрате ) так,что суммы по каждому столбцу,каждой строке и и каждой из двух больших диагоналей равны между собой.
построить такой квадрат!

пример магич квадрата порядка 3:

6 1 8
7 5 3
2 9 4
фзк вне форума   Ответить с цитированием

Старый 19.04.2010, 10:41
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Возможно, ваш вопрос уже получил решение на форуме

Помогите решить задачу в Паскале
Помогите решить задачу на Паскале

Старый 19.04.2010, 14:37   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,980
Сказал(а) спасибо: 322
Поблагодарили 543 раз(а) в 184 сообщениях
Репутация: 102235
По умолчанию

Ау, коллеги-математики, требуется помощь!
Полез в Вики: Магический квадрат — Википедия , там в разделе "Прочие способы" (первый абзац) есть простенькая формула, правда годится только для нечетных n > 3. Ну мгновенно нарисовал программку:
Код:
VAR
 N,i,j,a:LongInt;
BEGIN
 Write('Enter ODD order of magic square ');
 ReadLn(N);
 For i:=1 to N do
  begin
   for j:=1 to N do
    begin
     a:=1+((i-j+(N-1) div 2) mod N)*N+
          ((i+j+(N+1) div 2) mod N);
     Write(a:3);
    end;
   WriteLn;
  end;
 ReadLn;
END.
да только беда в том, что врет она. Т.е. считает правильно только элементы главной диагонали и ниже, а к верхнему правому углу начинает выдавать полную бредятину (отрицательные числа и т.п.). Вот сижу, смотрю и не недоумеваю - то ли формула дурная, то ли я ее не так понимаю, то ли в программе лажа. Идеи?
P.S. Со знаками воевать пытался: вставлял ABS в разные места - не помогает. Всё равно чушь, хоть и положительная.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S на форуме   Ответить с цитированием
Старый 19.04.2010, 17:25   #3 (permalink)
фзк
Новичок
 
Регистрация: 19.04.2010
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Магические квадраты нечетного порядка (n=2m+1) можно построить согласно правилу Лалубера, который состоит из следующих условий. В первую очередь число 1 помещается в среднюю клетку верхней строки. Последующие числа помещаются в их обычном порядке в направлении диагонали в правую верхнюю клетку относительно данных.
В течение данного процесса следует опираться на следующие три условия:
1. при достижении верхней строки следующее число помещается в нижнюю строку так, как будто она находится над верхней строкой;
2. при достижении крайнего правого столбца следующее число помещается в крайний левый столбец так, как будто он находится около крайнего правого столбца;
3. при достижении верхней клетки крайнего правого столбца следует опуститься на одну строку ниже в вертикальном порядке и продолжать заполнение клеток по правилу. Например:
17-24-01-08-15
23-05-07-14-16
04-06-13-20-22
10-12-19-21-03


Для квадратов порядка n > 4 имеем следующий метод: помещаем все числа от 1 до n-в-квадрате в их обычном порядке во все строки данного квадрата (число 1 находится в первой клетке верхней строки, а n-в-квадрате находится в последней клетке нижней строки). Затем делим данный квадрат на малые квадраты 4х4 и проводим в них диагонали. Их обьединения образуют более длинные диагонали) Далее последовательно замещаем числа в диагональных клетках числами добавочными относительно них (которые помещены симметрично начальным числам относительно центра данного большого квадрата). В итоге получем магический квадрат двойной четности.
Построение магических квадратов двойной четности: а) и б) - для n=4, в) и г) - для n=8.
Заполняем по порядку:
01-02-03-04
05-06-07-08
09-10-11-12
13-14-15-16
Диагональные клетки меняем местами с симметричными с ними:
16-02-03-13
05-11-10-08
09-07-06-12
04-14-15-01

01-02-03-04-05-06-07-08
09-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-47-48
49-50-51-52-53-54-55-56
57-58-59-60-61-62-63-64

64-02-03-61-60-06-07-57
09-55-54-12-13-51-50-16
17-47-46-20-21-43-42-24
40-26-27-37-36-30-31-33
32-34-35-29-28-38-39-25
41-23-22-44-45-19-18-48
49-15-14-52-53-11-10-56
08-58-59-05-04-62-63-01
11-18-25-02-09
фзк вне форума   Ответить с цитированием
Старый 19.04.2010, 17:30   #4 (permalink)
фзк
Новичок
 
Регистрация: 19.04.2010
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Program MagicSquare;
Uses Crt;
Var A : Array [1..20, 1..20] of Integer;
i, j, N : Integer;
Standard, S : Integer; {Standard - сумма-эталон, S - текущая
сумма}
Flag : Boolean;
{-------------------------------------}
Procedure InputOutput; {описание процедуры ввода-вывода
матрицы}
Begin
ClrScr;
Write('Количество строк и столбцов - ');
ReadLn(N);
For i := 1 to N do
For j := 1 to N do
begin Write('A[' , i , ', ' , j , '] = ');
ReadLn(A[i, j])
end;
ClrScr;
WriteLn('Исходная матрица :'); WriteLn;
For i := 1 to N do
begin
For j := 1 to N do Write(A[i, j] : 5);
WriteLn
end; WriteLn
End; { of InputOutput }
{-------------------------------------------}
Procedure MagicOrNot(Var Flag : Boolean); {описание
процедуры, }
{в которой выясняется, является ли квадрат
"магическим"}
Begin {вычисление суммы элементов главной диагонали}
{в качестве эталонной суммы}
Standard:=0;
For i := 1 to N do Standard := Standard + A[i,i];
Flag:=TRUE; i:=1;
While (i<=N) and Flag do {вычисление сумм элементов строк}
begin
S:=0;
For j := 1 to N do S := S+A[i, j];
If S<>Standard then Flag := FALSE else i:=i+1


end;
j:=1;
While (j<=N) and Flag do {вычисление сумм элементов столбцов}
begin
S:=0;
For i := 1 to N do S:=S+A[i, j];
If S<>Standard then Flag := FALSE else j := j+1
end;
If Flag then
begin
S:=0; {вычисление суммы элементов побочной диагонали}
For i := 1 to N do S := S+A[i, N+1-i];
If S<>Standard then Flag := FALSE;
end;
End;
{--------------------------------------------------------}
BEGIN
InputOutput; {Вызов процедуры ввода-вывода }
MagicOrNot(Flag); {Вызов процедуры решения задачи }
If Flag then WriteLn('Это магический квадрат.')
else WriteLn('Это не магический квадрат.');
ReadLn
END.

как думаете это правильно ???
фзк вне форума   Ответить с цитированием
Старый 19.04.2010, 17:32   #5 (permalink)
фзк
Новичок
 
Регистрация: 19.04.2010
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Program MagicSquare;
Uses Crt;
Var A : Array [1..20, 1..20] of Integer;
i, j, N : Integer;
Standard, S : Integer; {Standard - сумма-эталон, S - текущая
сумма}
Flag : Boolean;
{-------------------------------------}
Procedure InputOutput; {описание процедуры ввода-вывода
матрицы}
Begin
ClrScr;
Write('Количество строк и столбцов - ');
ReadLn(N);
For i := 1 to N do
For j := 1 to N do
begin Write('A[' , i , ', ' , j , '] = ');
ReadLn(A[i, j])
end;
ClrScr;
WriteLn('Исходная матрица :'); WriteLn;
For i := 1 to N do
begin
For j := 1 to N do Write(A[i, j] : 5);
WriteLn
end; WriteLn
End; { of InputOutput }
{-------------------------------------------}
Procedure MagicOrNot(Var Flag : Boolean); {описание
процедуры, }
{в которой выясняется, является ли квадрат
"магическим"}
Begin {вычисление суммы элементов главной диагонали}
{в качестве эталонной суммы}
Standard:=0;
For i := 1 to N do Standard := Standard + A[i,i];
Flag:=TRUE; i:=1;
While (i<=N) and Flag do {вычисление сумм элементов строк}
begin
S:=0;
For j := 1 to N do S := S+A[i, j];
If S<>Standard then Flag := FALSE else i:=i+1


end;
j:=1;
While (j<=N) and Flag do {вычисление сумм элементов столбцов}
begin
S:=0;
For i := 1 to N do S:=S+A[i, j];
If S<>Standard then Flag := FALSE else j := j+1
end;
If Flag then
begin
S:=0; {вычисление суммы элементов побочной диагонали}
For i := 1 to N do S := S+A[i, N+1-i];
If S<>Standard then Flag := FALSE;
end;
End;
{--------------------------------------------------------}
BEGIN
InputOutput; {Вызов процедуры ввода-вывода }
MagicOrNot(Flag); {Вызов процедуры решения задачи }
If Flag then WriteLn('Это магический квадрат.')
else WriteLn('Это не магический квадрат.');
ReadLn
END.
фзк вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 19.04.2010, 17:32   #6 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,937
Записей в дневнике: 10
Сказал(а) спасибо: 139
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

Проверьте
MrSTEP вне форума   Ответить с цитированием
Старый 19.04.2010, 17:50   #7 (permalink)
фзк
Новичок
 
Регистрация: 19.04.2010
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

mr.Step Какое отношение ваше сообщение,имеет к данной теме ??
фзк вне форума   Ответить с цитированием
Старый 19.04.2010, 20:50   #8 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,980
Сказал(а) спасибо: 322
Поблагодарили 543 раз(а) в 184 сообщениях
Репутация: 102235
По умолчанию

Цитата:
Сообщение от фзк Посмотреть сообщение
mr.Step Какое отношение ваше сообщение,имеет к данной теме ??
По-моему, самое прямое. Это ответ на вопрос, заданный Вами в последней строке #4.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S на форуме   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 19:52.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.