如何在C中连接两个整数

010*_*101 17 c math optimization mathematical-optimization

Stack Overflow用许多其他语言回答了这个问题,但不是C.所以我想我会问,因为我有同样的问题.

如何在C中连接两个整数?

例:

x = 11;
y = 11;
Run Code Online (Sandbox Code Playgroud)

我想z如下:

z = 1111;
Run Code Online (Sandbox Code Playgroud)

其他示例尝试使用字符串执行此操作.没有字符串的方法是什么?

我正在寻找一种在C中执行此操作的有效方法,因为在我的特定用法中,这将成为代码的时间关键部分.

提前致谢!

Moo*_*uck 37

unsigned concatenate(unsigned x, unsigned y) {
    unsigned pow = 10;
    while(y >= pow)
        pow *= 10;
    return x * pow + y;        
}
Run Code Online (Sandbox Code Playgroud)

编译/正确性/速度证明

我避免使用log10pow函数,因为我很确定它们使用浮点并且速度很慢,所以在你的机器上这可能会更快.也许.轮廓.

  • 必须是`y> = pow`,我不认为`concatenate(1,10)`应该是20. (4认同)
  • 存在潜在的无限循环:例如,在32位系统上尝试`concatenate(1,1000000000)`.您可以使用`if(pow> UINT_MAX/10)返回y;``while`循环内部来避免它. (3认同)

Dru*_*erB 9

z = x * pow(10, log10(y)+1) + y;
Run Code Online (Sandbox Code Playgroud)

说明:

首先,您获得应该变为第二的变量的位数:

int digits = log10(y)+1;  // will be 2 in your example
Run Code Online (Sandbox Code Playgroud)

然后通过将其与10 ^位相乘来"移动"另一个变量.

int shifted = x * pow(10, digits);   // will be 1100 in your example
Run Code Online (Sandbox Code Playgroud)

最后添加第二个变量:

z = shifted + y;   // 1111
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

z = x * pow(10, (int)log10(y)+1) + y;
Run Code Online (Sandbox Code Playgroud)

  • 我赞成你的回答,因为你实际上解释了一些东西。 (2认同)