Поменяйте местами три числа в одном утверждении - PullRequest
12 голосов
/ 26 декабря 2011

Есть ли возможность поменять три числа в одном выражении

Например:

  • a = 10
  • b = 20
  • c = 30

Я хочу, чтобы значения изменялись согласно следующему списку

a = 20
b = 30
c = 10

Можно ли эти значения перенести в одну строку?

Ответы [ 8 ]

7 голосов
/ 26 декабря 2011
$ python
>>> a, b, c = 10, 20, 30
>>> print a, b, c
10 20 30
>>> a, b, c = b, c, a
>>> print a, b, c
20 30 10
6 голосов
/ 26 декабря 2011

Это глупый вопрос.Но вот единственный ответ (пока), который является одновременно четко определенным C и действительно единственной строкой:

a ^= b, b ^= a, a ^= b, b ^= c, c ^= b, b ^= c;

Использует алгоритм замены XOR , правильно.

Примечание: Предполагается, что a, b и c имеют одинаковый целочисленный тип (вопрос не указан).

5 голосов
/ 26 декабря 2011

Решение в C #.Сначала используйте xor swap a и b.Результатом присваивания является присвоенное значение, в этом случае b является самой левой переменной, поэтому оно возвращается как результат (b ^= a ^ (a ^= b ^= a)).Затем поменяйте местами c и b , используя тот же алгоритм .:)

            int a = 10;
            int b = 20;
            int c = 30;
            c ^= (b ^= a ^ (a ^= b ^= a)) ^ (b ^= c ^= b);
4 голосов
/ 26 декабря 2011

Воспользуйтесь оператором запятой ...

a = 10;
b = 20;
c = 30;
/* one statement */
tmp = a, a = b, b = c, c = tmp; /* assumes tmp has been declared */
assert(a == 20);
assert(b == 30);
assert(c == 10);
3 голосов
/ 25 июня 2012

Я нашел другое решение для этого вопроса.

Вы можете использовать его на многих языках, таких как C,C++ and Java.

Это будет работать и для float и long.

a=(a+b+c) - (b=c) - (c=a);
3 голосов
/ 26 декабря 2011

Хм, мне нравятся эти логические вещи, мое решение:

a= b+c-((b=c)+(c=a))+c;

Кстати: я проверял это (на самом деле, используя JS) и работал с любыми числами:)

Править:

Я тестировал с отрицательными и десятичными знаками и тоже работал:)

1 голос
/ 26 декабря 2011

Поскольку вы не указали язык, я выберу один из моих вариантов.Это Руби.

sergio@soviet-russia$ irb
1.9.3p0 :001 > a = 10
 => 10 
1.9.3p0 :002 > b = 20
 => 20 
1.9.3p0 :003 > c = 30
 => 30 
1.9.3p0 :004 > a, b, c = b, c, a # <== transfer is happening here
 => [20, 30, 10] 
1.9.3p0 :005 > a
 => 20 
1.9.3p0 :006 > b
 => 30 
1.9.3p0 :007 > c
 => 10
0 голосов
/ 02 июля 2012

Попробуйте другой сценарий: Например:

a = 10
b = 20
c = 30

a= a+b+c;
b=a-b-c;
c=a-b-c;
a=a-b-c;

Для n чисел,

a = 10
b = 20
c = 30
.
.
.
n


a= a+b+c+......+n;
b=a-b-c-.......-n;
c=a-b-c-.......-n;
.
.
.
n=a-b-c-.......-n;
a=a-b-c-.......-n;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...