IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> сумма элементов из области матрицы, отмеченной символом *
valerosha
сообщение 15.10.2009 18:40
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Здравствуйте,
подскажите, пожалуйста, решение или укажите нужное направление

Var A: array [1..n, 1..n] of real; (n-нечетно).
Найти сумму элементов из области матрицы A, отмеченной символом ‘*’:
0 0 0 * 0 0 0
0 0 * * * 0 0
0 * * * * * 0
* * * * * * *
0 * * * * * 0
0 0 * * * 0 0
0 0 0 * 0 0 0
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 15.10.2009 21:34
Сообщение #2


Гость






Можно сделать ровно в 2 раза меньше циклов:
  s := 0;
for i := -(n div 2) to (n div 2) do
for j := abs(i) + 1 to n - abs(i) do s := s + arr[i + (n div 2) + 1, j];
 К началу страницы 
+ Ответить 
Lapp
сообщение 16.10.2009 5:36
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 15.10.2009 22:34) *
Можно сделать ровно в 2 раза меньше циклов

, а можно и совсем без циклов smile.gif :
const
n= 7;
m= n div 2 + 1;

var
a: array[1..n,1..n]of integer;

function Rhomb(i,j: integer): integer;
begin
if Abs(i-m)<m-Abs(j-m) then
if i=m then
Rhomb:= a[i,j]+Rhomb(i-1,j)+Rhomb(i+1,j)+Rhomb(i,j+1)
else
Rhomb:= a[i,j]+Rhomb(i+(i-m) div Abs(i-m),j)
else Rhomb:=0
end;

begin
{input a}
WriteLn('Rhomb Summ is: ',Rhomb(m,1));
ReadLn
end.

smile.gif Прошу (volvo)) особо не придираться, я в курсе возможных проблем со стеком и вообще эффективности. Это, скорее, хохма smile.gif, но оно работает!
Еще сие можно рассматривать как демонстрацию принципиальной взаимозаменимости циклов и рекурсии во многих случаях.

И еще один любопытный факт, обнаруженный во время тестирования программы..
Если исходную матрицу заполнить всю единицами:

1 1 1
1 1 1
1 1 1
,
for i:=1 to n do for j:=1 to n do a[i,j]:=1;

- и составить последовательность результатов при n=1,3,5,7,11,13... , то результат будет такой:

1, 5, 13, 25, 41, 61, 85...

Это прекрасно соответствует формуле:

s=n2/2+0.5

- как и должно быть, если рассмотреть это как площадь, занимаемую ромбом. В этом я не усматриваю особого интереса, но если заполнить матрицу вот так:

1 2 3
4 5 6
7 8 9
,
for i:=1 to n do for j:=1 to n do a[i,j]:=i+(j-1)*n;

- то есть, по возрастающей слева направо и сверху вниз - то соответственная последовательность сумм будет вот такая:

1, 25, 169, 625, 1681, 3721, 7225...

- и в ней легко разглядеть квадраты членов первой последовательности smile.gif.
Вот, сижу и думаю: какой в этом скрытый смысл)), и как это можно было бы предсказать без предварительного эксперимента?.. smile.gif

Хм?.. rolleyes.gif

Добавлено через 13 мин.
Все, я допер, все оказалось просто smile.gif (очень помогает пройтись пешком, пусть даже и недолго)).
Есть интерес/нужда послушать?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 19:50
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"