Разбить последовательность чисел от 1 до N^2 на N последовательностей так, чтобы все они состояли из N чисел и имели равные суммы. Результат вывести на экран, либо в текстовый файл.
Разбить последовательность чисел от 1 до N^2 на N последовательностей так, чтобы все они состояли из N чисел и имели равные суммы. Результат вывести на экран, либо в текстовый файл.
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
10 июня 2008 в 3:04
Видимо, я старомоден.
10 июня 2008 в 3:03
Вау, ирония.
Не знаю как тебе, а мне было бы совершенно лень объяснять каким образом формула i+j*(N+1)-ord(j+i>N)*N задает числа, удовлетворяющие решению задачи. а так все просто: берем, создаем очевидным образом массив и выводим его диагонали–все! Вот тебя смущает мой логический переход, а зря.
Когда читаешь сочинение первоклассника размышляешь всяко меньше чем над высказыванием Вольтера. Потому что Вольтер думал, а первоклассник нет(ну, может и думал, но…короче все понятно=).
>Вообще, думать при решении алгоритмических задач — необязательно. Особенно, если это обучающие задачки в институте.
этот сарказм слегка противоречит следующему заявлению:
> Алгоритм же простой как три копейки.
А, если честно, думать при решении "в лоб" простых задач, таких как эта, действительно необязательно. Не вижу в этом утверждении ничего абсурдного. К тому же, если у автора темы вызывает сложности реализовать алгоритм на паскале, он вряд ли задумывается над оптимизацией алгоритма, там, количеством операций, используемой памятью и т.д.
10 июня 2008 в 3:00
Паша, все слова — в рамку.
"Когда я писал первый код я вообще не думал. А значит и человек, который будет в моем коде разбираться, не обязан утруждать себя этим."
Логический переход вызывает восхищение! Вообще, думать при решении алгоритмических задач — необязательно. Особенно, если это обучающие задачки в институте.
10 июня 2008 в 2:03
>Не хрена не понятней. Меньшее количество строк, не означает, что эти строки быстрее поймут.
Во-во. Я к тому что, когда я писал второй код, мне пришлось думать, хоть и немного. Когда я писал первый код я вообще не думал. А значит и человек, который будет в моем коде разбираться, не обязан утруждать себя этим.
Ну, это как, эээ… это как, если вы хотите узнать решение задачи, вам явно будет понятнее если вам покажут именно решение, а не формулу для вычисления ответа. вот так же и здесь.
10 июня 2008 в 0:01
Алексей, а ты все буквы прочитал в моем сообщении?
10 июня 2008 в 0:00
Не хрена не понятней. Меньшее количество строк, не означает, что эти строки быстрее поймут.
9 июня 2008 в 19:05
Просьба без наездов. Помощь была обеспечена на 3-х языках программирования со всевозможными пояснениями. Сожалеть о том, что не дали 100% готовый код на паскале может лишь ленивый болван, а не студент высшего учебного заведения. Плюс, нужно понять, что кое-кто вообще не умеет писать на паскале (например, я).
Что касается легкости понимания, то второй вариант куда более понятен, чем первый хотя бы потому, что лаконичней в три раза без лишнего шифрования.
9 июня 2008 в 19:04
Блин, это была обучающая программа. вот ее более изящное решение:
uses crt;
var i,j,n:integer;
begin
readln(N);
for i:=1 to n do begin
for j:=0 to n-1 do
write(i+j*(N+1)-ord(j+i>N)*N:4);
writeln;
end;
end.
пожалуйста, я придумал и быстрый, и лаконичный алгоритм. это было не особо сложно. только вряд ли его так же легко понять как то, что я написал до этого.
и, вместо того чтобы понтоваться и выпендриваться, можно было просто помочь человеку.
9 июня 2008 в 18:04
Код незачетный, товарищи. Во-первых, незачет за статическое объявление массива 10Kx10K. Во-вторых, этот массив вам вообще не нужен.
9 июня 2008 в 16:00
короче, вот код.
uses crt;
var i,j,n:integer;
a:array[1..10000,1..10000] of integer;
begin
readln(N);
for i:=1 to N do
for j:=1 to N do begin
a[j,i]:=(i-1)*N+j;{заполняем массив таким образом}
a[j+n,i]:=(i-1)*N+j;
end;
for i:=1 to N do begin
for j:=1 to 2*N do
write(a[j,i]:4);
writeln;{на всякий случай выведем его–он выглядит так}
end;
writeln;{пропустим строку}
for i:=0 to N-1 do begin
for j:=1 to n do
write(a[j+i,j]:4); {а теперь просто выведем N его диагоналей}
writeln;
end;
readln;
end.
9 июня 2008 в 8:00
Блин, да ты скажи, что у тебя не получается-то. Алгоритм же простой как три копейки. i-й столбец циклически сдвинут на i, вот и все! Если есть проблема перевести это на паскаль, то тут я, боюсь, ничем не могу помочь.
9 июня 2008 в 7:01
Ну, раз пошла такая пьянка..
Вот на J:
|:(i.5)&(|."0 1) (5 5 $ i.25)
9 июня 2008 в 7:01
народ, уже не смешно
работа горит
9 июня 2008 в 7:00
> ((c+r)%n)
да, руби, конечно, рулит, но вот как бы это преобразовать на паскаль
9 июня 2008 в 3:01
Wolfram Mathematica:
RotateLeft~MapIndexed~Partition[Range[1, n^2], n]//Transpose //TableForm
9 июня 2008 в 2:03
#!/usr/bin/env ruby
n = 5
puts (0…n).map{|c|(0…n).map{|r|r*n+((c+r)%n)+1}*" "}*"\n"
1 7 13 19 25
2 8 14 20 21
3 9 15 16 22
4 10 11 17 23
5 6 12 18 24
9 июня 2008 в 2:03
То же самое, но более развернуто:
n.times do |c|
n.times do |r|
print(r*n + ((c+r)%n) + 1, " ")
end
print "\n"
end
9 июня 2008 в 0:00
може это не оптимально, но можно заметить…
что получить требуемые последовательности можно из матрицы элементов записанной попорядку по столбцам путем циклического сдвига элементов в каждом столбце на
(номер столбца – 1) количество элементов.
Тоесть, есть матрица
15913
26 1014
37 1115
48 1216
1й столбец не сдвигается, 2ой циклически сдвигаем на (2 – 1) = 1 элемент:
6
7
8
5
3ий столбец циклически сдвигаем на (3 – 1) = 2 элемента :
11
12
9
10
4ый столбец циклически сдвигаем на (4-1)= 3 элемента :
16
13
14
15
получили
1 6 11 16
2 7 12 13
3 89 14
4 5 10 15
теперь осталось построчно вывести последовательности
8 июня 2008 в 22:05
нет, агоритм неправильный. надо что-то другое искать.
пробовал вот так:
var
a,i,j,s: integer;
begin
readln(a);
for i:=1 to a do
begin
for j:=0 to a-1 do
begin
s:= i + a*j + j;
write(s:4);
end;
writeln;
end;
readln;
end.
но выводит правильно лишь первые строки.
8 июня 2008 в 22:04
Дело за малым – перевести его с русского в программу.
Попробуй написать его по-русски еще более точно и близко к языку программирования, до уровня циклов, переменных итп.
Если хочешь, чтобы помогли – напиши весь алгоритм на русском языке и уточни, что именно у тебя не получается перевести в код.
8 июня 2008 в 22:03
написал только компилятор Великий и Могучий русский язык не понимает))
8 июня 2008 в 22:00
Ну так и в чем проблема? Напиши алгоритм русским языком, а потом переведи в программу.
8 июня 2008 в 21:05
до этого я дошёл и сам..
вот сейчас пытаюсь как раз воплотить программно.
8 июня 2008 в 21:04
Посмотрите на примеры:
N = 3
1 2 3
4 5 6
7 8 9
Три последовательности:
1 5 9
2 6 7
3 4 8
N = 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Четыре последовательности:
1 6 11 16
2 7 12 13
3 8 9 14
4 5 10 15
P.S. Надеюсь стало понятно как выбирать последовательности.