LINUX.ORG.RU
ФорумTalks

[программирование] Задачка, 8-й класс

 


0

0

Я вам тут задачку нашел. Из олимпиады по информатике 8 класс 1990г.

Есть переменные A и B. Допустим А=4 В=7. Для того чтобы поменять значениями А и В достаточно использовать третью переменную. Например С. Выглядеть это будет следующим образом C:=A A:=B B:=C Всего 3 действия.

Задача: Поменять значениями А и В за 3 действия, но не используя промежуточной переменной.


Ответ на: комментарий от dimon555

> кстати A+B могут вызвать переполнение

Если придиратся к деталям, то xor тоже не прокатит. Что если длинна переменных разная? Или тип у них float, или конкретная машина xor не умеет:)? А если я решал задачу, используя нестрого типизиованный язык?

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

vgudkov
()
Ответ на: комментарий от vgudkov

>Что если длинна переменных разная?

Тогда в общем виде задача неразрешима.

>Или тип у них float

Сделать побайтовый xor.

>конкретная машина xor не умеет

Ну что за бред? А если она сложение не умеет? :)

Если в задаче список допустимых операций не указан, то подразумевается что подходит всё.

Davidov ★★★★
()
Ответ на: комментарий от Davidov

>>Или тип у них float

>Сделать побайтовый xor.

На уровне переменных? Как? Далеко не во всех языках можно лазить в память как в Си.

>>конкретная машина xor не умеет

>Ну что за бред? А если она сложение не умеет? :)

Есть языки и архитектуры без XOR. Но я не знаю языков и архитектур без сложения.

KRoN73 ★★★★★
()

Изменяемые переменные не нужны.

Miguel ★★★★★
()
Ответ на: комментарий от vgudkov

>Если придиратся к деталям, то xor тоже не прокатит. Что если длинна переменных разная? Или тип у них float, или конкретная машина xor не умеет:)? А если я решал задачу, используя нестрого типизиованный язык?

Ога, давай еще придумаем, а если одна переменная строка, а вторая указатель?

ЗЫЖ боян, видел когда-то даже в документации ынтел по оптимизации.

madcore ★★★★★
()
Ответ на: комментарий от KRoN73

>На уровне переменных? Как? Далеко не во всех языках можно лазить в память как в Си.

В таком случае задачка опять же не решается. Чему равно NAN+0.1? Не говоря о потере точности.

>Есть языки и архитектуры без XOR. Но я не знаю языков и архитектур без сложения.

Brainfuck, Oak (или как он там называется). :)

По старой доброй традиции, если в условии не указано ограничение, его не существует.

Davidov ★★★★
()
Ответ на: комментарий от lester

>можно реализовать средствами самого языка

А xor целых переменных, очевидно, средствами языка реализовать нельзя. Я правильно понимаю?

Davidov ★★★★
()
Ответ на: комментарий от vgudkov

>A = A + B
>B = A - B

>A = A - B


+1, такой же вариант в голову пришел

nu11 ★★★★★
()

> . Из олимпиады по информатике 8 класс 1990г. > 8 класс 1990г.

ВАСИК же!

iBliss
()

var
  a, b : word;
begin
  a := 666;
  b := 13;
  writeln('a = ', a, 'b = ', b ); 
  asm
    push a
    push b
    pop a
    pop b
  end;
  writeln('a = ', a, 'b = ', b ); 
  readln;
end.

matich
()
Ответ на: комментарий от ip1981

Ну и что, работать всё равно будет, при вычитании в обратную сторону переполнится (если мы говорим про традиционные представления чисел).

Legioner ★★★★★
()
Ответ на: комментарий от kub

>Тогда уж
>xchg a, b


Не получицца, xchg поддерживает только обмен с участием регистра, надо так:

mov EAX, A
xchg EAX, B
mov A, EAX

всё равно 3 действия (зато быстрей)

Attila ★★
()

народ, ну вы даете :)
спасибо, поржал. На любую самую простейшую задачку вы найдете столько рещений и вариантов с нюансами, что профессора бы вам позавидовали :)

vitroot ★★
()

Можно за 2 операции, но прокатит только на двухядерном процессоре и надо запускать одновременно:

A = B

B = A

vilfred ☆☆
()
Ответ на: комментарий от vilfred

если одновременно, то символически можно посчитать за одну операцию :)

vitroot ★★
()

> Есть переменные A и B. Допустим А=4 В=7. Для того чтобы поменять значениями А и В достаточно использовать третью переменную. Например С. Выглядеть это будет следующим образом C:=A A:=B B:=C Всего 3 действия.
> Задача: Поменять значениями А и В за 3 действия, но не используя промежуточной переменной.


Элементарно же. Можно и за два действия:

A=7
B=4

А вы тут напридумывали всякого! =)

Deleted
()
Ответ на: комментарий от vitroot

>народ, ну вы даете :)

мы - жалкие осколки Анонимного Разума некогда существовавшего на ЛОРе :)

Attila ★★
()
Ответ на: комментарий от exception13

>a = a^(b = (a = a^b)^b);

Что-то у меня создаётся впечатление, что здесь результат зависит от компилятора.

Zenom ★★★
()

аналогично питону

serge@blackstone:~$ irb
irb(main):001:0> a = 1
=> 1
irb(main):002:0> b = 2
=> 2
irb(main):003:0> a, b = b, a
=> [2, 1]
irb(main):004:0> a
=> 2
irb(main):005:0> b
=> 1
irb(main):006:0>

exception13 ★★★★★
()
Ответ на: комментарий от Zenom

serge@blackstone:~$ gcc -c t.c -o t
t.c: In function ‘main’:
t.c:7: warning: ‘return’ with a value, in function returning void
t.c:1: warning: return type of ‘main’ is not ‘int’
serge@blackstone:~$ objdump -d t

t: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c7 45 f8 01 00 00 00 movl $0x1,-0x8(%rbp)
b: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%rbp)
12: 8b 45 fc mov -0x4(%rbp),%eax
15: 31 45 f8 xor %eax,-0x8(%rbp)
18: 8b 45 f8 mov -0x8(%rbp),%eax
1b: 31 45 fc xor %eax,-0x4(%rbp)
1e: 8b 45 fc mov -0x4(%rbp),%eax
21: 31 45 f8 xor %eax,-0x8(%rbp)
24: c9 leaveq
25: c3 retq
serge@blackstone:~$ arm-linux-gnueabi-gcc -c t.c -o t
t.c: In function ‘main’:
t.c:7: warning: ‘return’ with a value, in function returning void
t.c:1: warning: return type of ‘main’ is not ‘int’
serge@blackstone:~$ arm-linux-gnueabi-objdump -d t

t: file format elf32-littlearm


Disassembly of section .text:

00000000 <main>:
0: e1a0c00d mov ip, sp
4: e92dd800 push {fp, ip, lr, pc}
8: e24cb004 sub fp, ip, #4 ; 0x4
c: e24dd008 sub sp, sp, #8 ; 0x8
10: e3a03001 mov r3, #1 ; 0x1
14: e50b3014 str r3, [fp, #-20]
18: e3a03002 mov r3, #2 ; 0x2
1c: e50b3010 str r3, [fp, #-16]
20: e51b2014 ldr r2, [fp, #-20]
24: e51b3010 ldr r3, [fp, #-16]
28: e0223003 eor r3, r2, r3
2c: e50b3014 str r3, [fp, #-20]
30: e51b2010 ldr r2, [fp, #-16]
34: e51b3014 ldr r3, [fp, #-20]
38: e0223003 eor r3, r2, r3
3c: e50b3010 str r3, [fp, #-16]
40: e51b2014 ldr r2, [fp, #-20]
44: e51b3010 ldr r3, [fp, #-16]
48: e0223003 eor r3, r2, r3
4c: e50b3014 str r3, [fp, #-20]
50: e24bd00c sub sp, fp, #12 ; 0xc
54: e89d6800 ldm sp, {fp, sp, lr}
58: e12fff1e bx lr
serge@blackstone:~$

exception13 ★★★★★
()
Ответ на: комментарий от dimon555

>кстати A+B могут вызвать переполнение

тоилько если это float/double.

int не может. учись.

scaldov ★★
()

С:
a ^= b ^= a ^= b;

Python:
a,b = b,a

yoghurt ★★★★★
()

в васике можно было сделать просто, ЕМНИП:

swap A, B

Demon37 ★★★★
()

подобные темы хорошо демонстрируют то , чем страдают наши программисты вместо написания реального кода, который вместо них в этом момент пишут индусы, и сами знаете как они его пишут

Sylvia ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.