Поменяйте содержимое трех ячeек a,b,c. (обмен выполняeтся циклически a->b, b->c, c->a). дополнительных переменных не использовать
Помогите решить
volvo
9.10.2010 0:34
Сам-то пробовал? Задача на 3 минуты, если подумать и решается в 4 шага. В чем затруднения у тебя, расскажи?
P.S. Для разминки - сначала попробуй решить задачу для ДВУХ переменных, не пользуясь дополнительной.
TarasBer
9.10.2010 1:02
А какого типа переменные?
> Задача на 3 минуты, если подумать
Я в своё время не осилил.
Unconnected
9.10.2010 1:14
Такая, только с двумя переменными, была года два назад на какой-то олимпиаде... осилил, методом научного тыка.) Ну для 3х не сильно отличаться будет.
Lapp
9.10.2010 3:06
Цитата(volvo @ 8.10.2010 21:34)
Задача на 3 минуты, если подумать
Думанье включается в 3 мин? )) У меня не было случая ее порешать ((, я прочитал сразу в какой-то книге (о вреде чтения, кстати)). Я сильно сомневаюсь, что я бы ее асилел..
Unconnected
9.10.2010 3:58
Я чего-то недопонял, или все дело правда тут?)
var a,b,c:integer;
Procedure swap(var v1,v2:integer);
begin
inc(v1,v2);
v2:=v1-v2;
v1:=v1-v2;
end;
begin
read(a,b,c);
swap(a,b);
swap(b,c);
swap(c,a);
write(a,' ',b,' ',c);
end.
Кстати, кажется, такой обмен (a->b, b->c, c->a) эквивалентен b->c..
TarasBer
9.10.2010 4:13
> Кстати, кажется, такой обмен (a->b, b->c, c->a) эквивалентен b->c..
swap(c,a) тут лишний.
Lapp
9.10.2010 4:35
Цитата(TarasBer @ 9.10.2010 1:13)
> Кстати, кажется, такой обмен (a->b, b->c, c->a) эквивалентен b->c..
swap(c,a) тут лишний.
Un, ты слишком буквально трактовал условие )). Если бы условие было a->b, b->a (что означает: значение из a должно перейти в b, а значение из b перейти в a) - ты бы тоже два раза свопил? ))
Unconnected
9.10.2010 4:41
Ну как бы для наглядности) Да я вообще то и написал это, в том посте))
Lapp
9.10.2010 8:36
Цитата(Unconnected @ 9.10.2010 1:41)
то и написал это
Так ты то написал или это? ))
Но!.. Un, ты забыл кое-что важное. В таком виде процедура swap не пройдет теста..
volvo
9.10.2010 14:41
Цитата
В таком виде процедура swap не пройдет теста..
А кроме всего прочего - она и не нужна тут ни разу, все делается гораздо проще.
Unconnected
9.10.2010 15:10
var a,b,c:integer;
begin
read(a,b,c);
c:=a+b+c;
b:=c-b-a;
a:=c-b-a;
a:=c-b-a;
c:=c-b-a;
write(a,' ',b,' ',c);
end.
Ну мне вообще проще было бы по первому способу...)
volvo
9.10.2010 15:17
Цитата
Ну мне вообще проще было бы по первому способу...)
Ну, вообще-то твой последний способ неправильный, тебя все время тянет сделать что-нибудь лишнее:
А что, правильное? Значение A у тебя вообще не меняется, скажем. Это так надо? Вообще написано, что старое значение A должно было перейти в B, а потом ей должно присвоиться новое значение - бывшее раньше в C...
Unconnected
9.10.2010 15:44
Но, в итоге содержание ячеек таким же и должно получиться ведь (эквивалентное b<->c)? Да, и правда, тут, наверное, важен сам процесс (наряду с неиспользованием доп.переменных).. Но и "чистого" обмена, по-моему, тут тоже не получится, будут левые действия, как сейчас.
Сбили с панталыку в начале темы, оптимизаторы ))
Dranik7
9.10.2010 21:21
Unconnected, в обоих вариантах нет циклов, а надо с помощью цикла
TarasBer
9.10.2010 21:48
> a:=c-b-a; > a:=c-b-a;
Зачем 2 раза? Один раз тут лишний, если его убрать, всё будет нормально.
> Unconnected, в обоих вариантах нет циклов, а надо с помощью цикла
В условии сказано, что нужен циклический обмен, этот код и делает цилический обмен. А если нужно, чтобы был цикл for i := ..., то надо, чтобы числа были не в переменных a, b, c, а в массиве, и требование, чтобы первый элемент перешёл в последний, а остальные сдвинулись на единичку назад.
Unconnected
9.10.2010 22:13
Цитата
Зачем 2 раза? Один раз тут лишний, если его убрать, всё будет нормально.
Он там не лишний.. "нормально" и сейчас, если иметь в виду конечный результат.
TarasBer
9.10.2010 22:26
> если иметь в виду конечный результат
Конечный результат - это не то, что получается в результате 3 парных перестановок. Понимаешь?
Unconnected
9.10.2010 22:54
Цитата
Конечный результат - это не то, что получается в результате 3 парных перестановок. Понимаешь?
Я имею в виду содержание ячеек после перестановок. Другой разговор, что я меняю не по инструкции, не в том порядке..
TarasBer
9.10.2010 23:22
У тебя в итоге (a,b,c) перешло в (a,c,b) А надо (a,b,c)->(b,c,a)
Цитата(Lapp)
Un, ты слишком буквально трактовал условие )). Если бы условие было a->b, b->a (что означает: значение из a должно перейти в b, а значение из b перейти в a) - ты бы тоже два раза свопил? ))
Unconnected
9.10.2010 23:40
Ёёмаё.. Целую страницу морочил я людям голову..( Сейчас ещё раз все перечитал - открылся новый, тайный смысл всех постов Вот что значит внимательно читать задание. Ну хорошо если правда все решается убиранием одной строки, по словам TarasBer'a.
Lapp
10.10.2010 4:55
Цитата(Unconnected @ 9.10.2010 20:40)
Ёёмаё..
.. и бутылка рому? )) йатарчйу ))
Цитата
открылся новый, тайный смысл всехмоих постов
"вознесшись прямо в рай, я в ад сойти готов.."
- извини, Un, я не удержался - уж очень хорошо ложилось..
Цитата
Ну хорошо если правда все решается убиранием одной строки, по словам TarasBer'a.
Нет, не все..
Unconnected
11.10.2010 3:30
Цитата
А надо (a,b,c)->(b,c,a)
Опять торможу, что ли.. А разве (a,b,c) не в (с,a,b) должно перейти за один циклический сдвиг?
Цитата
"вознесшись прямо в рай, я в ад сойти готов.."
"метаясь меж begin и end, во имя трёх основ..." ))
Да, убиранием не решается. Ну, тогда я бы возвратился к замене, то есть, к swap (немного не так использовав, конечно, в основном блоке). А что с ней не так? Типа, открытые переменные в параметрах, побочные эффекты и т.п.?
TarasBer
11.10.2010 3:40
> А разве (a,b,c) не в (с,a,b) должно перейти за один циклический сдвиг?
А там надо вправо двигать, или влево? Ну или наоборот, короче сдвинуть на единицу.
> Ну, тогда я бы возвратился к замене, то есть, к swap (немного не так использовав, конечно, в основном блоке). А что с ней не так? Типа, открытые переменные в параметрах, побочные эффекты и т.п.?
В данном случае ты же не передаёшь туда одинаковые адреса, значит нормально всё будет.
Lapp
11.10.2010 6:40
Цитата(Unconnected @ 11.10.2010 0:30)
"метаясь меж begin и end, во имя трёх основ..."
Потерян размер и промежуточная рифма.. беру на себя смелость исправить: "метаясь между try - except во имя снов..."
и добавляю свою лепту "о, друг мой, самурай, не надо лишних слов"
Цитата(Unconnected @ 11.10.2010 0:30)
А что с ней не так? Типа, открытые переменные в параметрах, побочные эффекты и т.п.?
Типа того.. ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.