0

参考下面的问题, 如何在 C 中连接两个整数

unsigned concatenate(unsigned x, unsigned y) {
    unsigned pow = 10;
    while(y >= pow)
        pow *= 10;
    return x * pow + y;        
}

如何在不使用数组的情况下获取 x 和 y 的原始值?我需要更少的处理开销。

4

3 回答 3

1

您将两个参数传递给concatenate().
如果您将两个参数传递给unconcatenate()您,则可以取回您的数字:

void unconcatenate(unsigned *first, unsigned *second, unsigned concatenated, unsigned limit) {
    unsigned pow = 10;
    while (pow < limit) pow *= 10;
    *first = concatenated / pow;
    *second = concatenated % pow;
}

unsigned x, y, foo = concatenate(1234, 56);

unconcatenate(&x, &y, foo, 100);
printf("%u unconcatenaded to %u and %u.\n", foo, x, y);

https://ideone.com/bg7qMd

于 2021-09-27T14:49:58.653 回答
1

如何在不使用数组的情况下获取 x 和 y 的原始值?

信息丢失。需要重建x,y额外的信息。

示例 1234 可能是由

x    y
123  4
12   34
1    234
0    1234

旁白:改进了原始连接问题的答案

于 2021-09-27T14:18:07.050 回答
0

我还没有对此发表评论,但这个原始问题对我来说毫无意义。

至少根据我的经验,目标是将数字与已知的固定位数连接起来。例如,如果我有

int year = 2021;
int month = 10;
int day = 2;

(即下个月的日期),我想“连接”它们,期望的结果当然是 20211002。输出 2021102 是完全错误的——因为没有人知道它应该是 10 月 2 日,还是也许是 1 月 2 日!

在另一个问题上,有一条评论说“当 y == 0 时 100 * x + y 失败”,好像连接 23 和 0 应该产生 230,或者可能是 23,但这对我来说听起来很疯狂。

由于这里的问题是关于取回原始值,答案显然是要知道每个原始数字有多少位。例如,如果您知道您有两个 2 位数字xy,那么z = 100 * x + y绝对是连接它们的正确方法。然后,这样做后,取回原始值同样简单:

x = z / 100;
y = z % 100;

关键是我们y提前选择了有效设置为 2 位的神奇数字 100,并将其烘焙到代码中。我们没有正如其他问题的一些答案(以及此处的此问题中的代码片段)所建议的那样,通过连续乘以 10 在运行时动态地和凭经验发现比例因子。(并且不进行那些连续的乘法pow每次计算,我们的处理开销也会更少。)

摘要:在C中连接数字while(y >= pow) pow *= 10;错误的方法。正确的方法是

z = 100 * x * y;

一旦你这样做了,你就会得到原来的数字

x = z / 100;
y = z % 100;

如果y可能有更多位数,请选择一个大于 100 的适当乘数,然后改用它。请注意,如果您不小心,您的串联数字最终可能int会比普通数字更大。


PS 我说“如果你知道你有两个 2 位数的数字xy”,但这并不完全正确。如果您使用100 * x + y,则y必须为两位数(或更少),但x可以超过 2 位(在限制范围内)。

于 2021-09-27T16:08:30.597 回答