在单一陈述中交换三个数字

时间:2011-12-26 12:17:09

标签: c logic

是否有可能在一个陈述中交换三个数字

例如:

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

我希望根据以下列表更改值

a = 20
b = 30
c = 10

这些值可以在一行中传输吗?

8 个答案:

答案 0 :(得分:7)

$ 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

答案 1 :(得分:6)

这是一个愚蠢的问题。但是这里唯一的答案(到目前为止)是明确定义的C和真正的单行:

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

正确使用XOR swap algorithm

注意:这假定abc都是相同的整数类型(问题未指定)。

答案 2 :(得分:5)

C#中的解决方案。首先使用xor swap ab。赋值的结果是赋值,在这种情况下,b是最左边的变量,因此它作为(b ^= a ^ (a ^= b ^= a))的结果返回。然后交换cb using the same algorithm。 :)

            int a = 10;
            int b = 20;
            int c = 30;
            c ^= (b ^= a ^ (a ^= b ^= a)) ^ (b ^= c ^= b);

答案 3 :(得分:4)

使用逗号运算符...

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);

答案 4 :(得分:3)

嗯,我喜欢这些逻辑事物,我的解决方案:

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

BTW:我测试过(实际上使用JS)并使用任何数字:)

修改

我测试了负面&小数和工作:)

答案 5 :(得分:3)

我找到了另一个解决这个问题的方法。

您可以在C,C++ and Java等多种语言中使用此功能。

它也适用于floatlong

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

答案 6 :(得分:1)

由于你没有指定语言,我会选择一个我的选择。这是Ruby。

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

答案 7 :(得分:0)

尝试不同的场景:  例如:

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;