|
|
Опции темы | Опции просмотра |
19.04.2010, 10:41 | #1 (permalink) |
Новичок
Регистрация: 19.04.2010
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Товарищи, друзья, приятели, помогите кто может! Срочно надо решить задачу в паскале!
магическим квадратом порядка n называется квадратная матрица размера n*n составленная из чисел 1,2,...,n2 (в квадрате ) так,что суммы по каждому столбцу,каждой строке и и каждой из двух больших диагоналей равны между собой. построить такой квадрат! пример магич квадрата порядка 3: 6 1 8 7 5 3 2 9 4 |
19.04.2010, 10:41 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Возможно, ваш вопрос уже получил решение на форуме Помогите решить задачу в Паскале Помогите решить задачу на Паскале |
19.04.2010, 14:37 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ау, коллеги-математики, требуется помощь!
Полез в Вики: Магический квадрат — Википедия , там в разделе "Прочие способы" (первый абзац) есть простенькая формула, правда годится только для нечетных 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 в разные места - не помогает. Всё равно чушь, хоть и положительная. |
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, 20:50 | #8 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|